Skip to content

Commit 41262f4

Browse files
feat(Ruler): introduce Ruler service
Closes angular#1089 Closes angular#1253
1 parent c349eb4 commit 41262f4

File tree

8 files changed

+112
-2
lines changed

8 files changed

+112
-2
lines changed

modules/angular2/src/dom/browser_adapter.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ class BrowserDomAdapter extends GenericBrowserDomAdapter {
176176
document.implementation.createHtmlDocument('fakeTitle');
177177

178178
HtmlDocument defaultDoc() => document;
179+
Rectangle getBoundingClientRect(el) => el.getBoundingClientRect();
179180
String getTitle() => document.title;
180181
void setTitle(String newTitle) {
181182
document.title = newTitle;

modules/angular2/src/dom/browser_adapter.es6

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
5858
}
5959
content(node:HTMLElement):Node {
6060
if (this.hasProperty(node, "content")) {
61-
return node.content;
61+
return node.content;
6262
} else {
63-
return node;
63+
return node;
6464
}
6565
}
6666
firstChild(el):Node {
@@ -228,6 +228,9 @@ export class BrowserDomAdapter extends GenericBrowserDomAdapter {
228228
defaultDoc() {
229229
return document;
230230
}
231+
getBoundingClientRect(el) {
232+
return el.getBoundingClientRect();
233+
}
231234
getTitle() {
232235
return document.title;
233236
}

modules/angular2/src/dom/dom_adapter.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,9 @@ export class DomAdapter {
210210
defaultDoc() {
211211
throw _abstract();
212212
}
213+
getBoundingClientRect(el) {
214+
throw _abstract();
215+
}
213216
getTitle() {
214217
throw _abstract();
215218
}

modules/angular2/src/dom/parse5_adapter.cjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,9 @@ export class Parse5DomAdapter extends DomAdapter {
377377
}
378378
return defDoc;
379379
}
380+
getBoundingClientRect(el) {
381+
return {left: 0, top: 0, width: 0, height: 0};
382+
}
380383
getTitle() {
381384
return this.defaultDoc().title || "";
382385
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import {Promise, PromiseWrapper} from 'angular2/src/facade/async';
2+
import {DomAdapter} from 'angular2/src/dom/dom_adapter';
3+
import {NgElement} from 'angular2/src/core/dom/element';
4+
5+
export class Rectangle {
6+
left;
7+
right;
8+
top;
9+
bottom;
10+
height;
11+
width;
12+
constructor(left, top, width, height) {
13+
this.left = left;
14+
this.right = left + width;
15+
this.top = top;
16+
this.bottom = top + height;
17+
this.height = height;
18+
this.width = width;
19+
}
20+
}
21+
22+
export class Ruler {
23+
domAdapter: DomAdapter;
24+
constructor(domAdapter: DomAdapter) {
25+
this.domAdapter = domAdapter;
26+
}
27+
28+
measure(el:NgElement): Promise<Rectangle> {
29+
var clntRect = this.domAdapter.getBoundingClientRect(el.domElement);
30+
31+
//even if getBoundingClientRect is synchronous we use async API in preparation for further changes
32+
return PromiseWrapper.resolve(new Rectangle(clntRect.left, clntRect.top, clntRect.width, clntRect.height));
33+
}
34+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import 'dart:html';
2+
3+
Rectangle createRectangle(left, top, width, height) {
4+
return new Rectangle(left, top, width, height);
5+
}
6+
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function createRectangle(left, top, width, height) {
2+
return {left, top, width, height};
3+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import {AsyncTestCompleter, inject, ddescribe, describe, it, iit, xit, expect, SpyObject} from 'angular2/test_lib';
2+
3+
import {DOM, DomAdapter} from 'angular2/src/dom/dom_adapter';
4+
import {NgElement} from 'angular2/src/core/dom/element';
5+
6+
import {Ruler, Rectangle} from 'angular2/src/services/ruler';
7+
import {createRectangle} from './rectangle_mock';
8+
9+
class DomAdapterMock extends DomAdapter {
10+
rect;
11+
constructor(rect) {
12+
super();
13+
this.rect = rect;
14+
}
15+
16+
getBoundingClientRect(elm) {
17+
return this.rect;
18+
}
19+
}
20+
21+
function assertDimensions(rect: Rectangle, left, right, top, bottom, width, height) {
22+
expect(rect.left).toEqual(left);
23+
expect(rect.right).toEqual(right);
24+
expect(rect.top).toEqual(top);
25+
expect(rect.bottom).toEqual(bottom);
26+
expect(rect.width).toEqual(width);
27+
expect(rect.height).toEqual(height);
28+
}
29+
30+
export function main() {
31+
32+
describe('ruler service', () => {
33+
34+
it('should allow measuring NgElements',
35+
inject([AsyncTestCompleter], (async) => {
36+
var ruler = new Ruler(new DomAdapterMock(createRectangle(10, 20, 200, 100)));
37+
38+
ruler.measure(new NgElement(null)).then((rect) => {
39+
assertDimensions(rect, 10, 210, 20, 120, 200, 100);
40+
async.done();
41+
});
42+
}));
43+
44+
45+
it('should return 0 for all rectangle values while measuring elements in a document fragment',
46+
inject([AsyncTestCompleter], (async) => {
47+
var ruler = new Ruler(DOM);
48+
49+
ruler.measure(new NgElement(DOM.createElement('div'))).then((rect) => {
50+
//here we are using an element created in a doc fragment so all the measures will come back as 0
51+
assertDimensions(rect, 0, 0, 0, 0, 0, 0);
52+
async.done();
53+
});
54+
}));
55+
56+
});
57+
}

0 commit comments

Comments
 (0)