Skip to content
This repository was archived by the owner on Mar 13, 2018. It is now read-only.

Commit 12db94a

Browse files
committed
Merge pull request #273 from arv/scroll-top-setter
Make sure we handle both getter and setter for scrollTop etc
2 parents 8842682 + 80b8a47 commit 12db94a

3 files changed

Lines changed: 108 additions & 5 deletions

File tree

src/wrappers/HTMLElement.js

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,15 @@
130130
}
131131
});
132132

133-
function getterRequiresRendering(name) {
134-
defineGetter(HTMLElement, name, function() {
133+
function getter(name) {
134+
return function() {
135135
scope.renderAllPending();
136136
return this.impl[name];
137-
});
137+
};
138+
}
139+
140+
function getterRequiresRendering(name) {
141+
defineGetter(HTMLElement, name, getter(name));
138142
}
139143

140144
[
@@ -147,11 +151,26 @@
147151
'offsetTop',
148152
'offsetWidth',
149153
'scrollHeight',
150-
'scrollLeft',
151-
'scrollTop',
152154
'scrollWidth',
153155
].forEach(getterRequiresRendering);
154156

157+
function getterAndSetterRequiresRendering(name) {
158+
Object.defineProperty(HTMLElement.prototype, name, {
159+
get: getter(name),
160+
set: function(v) {
161+
scope.renderAllPending();
162+
this.impl[name] = v;
163+
},
164+
configurable: true,
165+
enumerable: true
166+
});
167+
}
168+
169+
[
170+
'scrollLeft',
171+
'scrollTop',
172+
].forEach(getterAndSetterRequiresRendering);
173+
155174
function methodRequiresRendering(name) {
156175
Object.defineProperty(HTMLElement.prototype, name, {
157176
value: function() {

test/js/HTMLElement.js

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Copyright 2013 The Polymer Authors. All rights reserved.
3+
* Use of this source code is goverened by a BSD-style
4+
* license that can be found in the LICENSE file.
5+
*/
6+
7+
suite('HTMLElement', function() {
8+
9+
var div;
10+
11+
setup(function() {
12+
div = document.body.appendChild(document.createElement('div'));
13+
div.style.cssText =
14+
'width: 100px; height: 100px; overflow: scroll;' +
15+
'position: absolute; top: 100px; left: 100px;' +
16+
'border: 10px solid red';
17+
var sr = div.createShadowRoot();
18+
var div2 = sr.appendChild(document.createElement('div'));
19+
div2.style.cssText = 'width: 1000px; height: 1000px';
20+
});
21+
22+
teardown(function() {
23+
if (div && div.parentNode)
24+
div.parentNode.removeChild(div);
25+
div = undefined;
26+
});
27+
28+
test('scrollTop', function() {
29+
assert.equal(div.scrollTop, 0);
30+
div.scrollTop = 100;
31+
assert.equal(div.scrollTop, 100);
32+
});
33+
34+
test('scrollLeft', function() {
35+
assert.equal(div.scrollLeft, 0);
36+
div.scrollLeft = 100;
37+
assert.equal(div.scrollLeft, 100);
38+
});
39+
40+
test('scrollHeight', function() {
41+
assert.equal(div.scrollHeight, 1000);
42+
});
43+
44+
test('scrollWidth', function() {
45+
assert.equal(div.scrollHeight, 1000);
46+
});
47+
48+
test('clientHeight', function() {
49+
div.style.overflow = 'hidden';
50+
assert.equal(div.clientHeight, 100);
51+
});
52+
53+
test('clientLeft', function() {
54+
div.style.overflow = 'hidden';
55+
assert.equal(div.clientLeft, 10);
56+
});
57+
58+
test('clientTop', function() {
59+
assert.equal(div.clientTop, 10);
60+
});
61+
62+
test('clientWidth', function() {
63+
div.style.overflow = 'hidden';
64+
assert.equal(div.clientWidth, 100);
65+
});
66+
67+
test('offsetHeight', function() {
68+
assert.equal(div.offsetHeight, 120);
69+
});
70+
71+
test('offsetLeft', function() {
72+
assert.equal(div.offsetLeft, 100);
73+
});
74+
75+
test('offsetTop', function() {
76+
assert.equal(div.offsetTop, 100);
77+
});
78+
79+
test('offsetWidth', function() {
80+
assert.equal(div.offsetWidth, 120);
81+
});
82+
83+
});

test/test.main.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ var modules = [
5858
'HTMLButtonElement.js',
5959
'HTMLCanvasElement.js',
6060
'HTMLContentElement.js',
61+
'HTMLElement.js',
6162
'HTMLFieldSetElement.js',
6263
'HTMLHeadElement.js',
6364
'HTMLHtmlElement.js',

0 commit comments

Comments
 (0)