Skip to content
This repository was archived by the owner on Nov 22, 2024. It is now read-only.

Commit 800db58

Browse files
author
Wassim Chegham
committed
feat(window): mocking window object
1 parent b63d2a7 commit 800db58

File tree

3 files changed

+190
-0
lines changed

3 files changed

+190
-0
lines changed

custom_typings/server.d.ts

+6
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,9 @@ declare module "xhr2" {
44
nodejsSet(url: any): any;
55
}
66
}
7+
8+
declare module NodeJS {
9+
interface Global {
10+
window: any | Window;
11+
}
12+
}

modules/universal/mock.js

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
var window = require('./dist/server/src/node/mock/window');
2+
global.window = window;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
import {DOM} from 'angular2/src/platform/dom/dom_adapter';
2+
import {provide} from 'angular2/core';
3+
4+
// the overloaded "window" must extend node's "global"
5+
// see: https://github.com/angular/angular/blob/master/modules/angular2/src/facade/lang.ts#L38
6+
var win = Object.create(global);
7+
8+
/**
9+
* Warn the developer about direct access to Window props
10+
* @param {String} prop The property being accessed
11+
*/
12+
function beDefensive(prop){
13+
return (<any>win).__defineGetter__(prop, () => {
14+
console.warn(`[WARNING] Property/method "${prop}" should not be called directly. Use DomAdapter instead.`);
15+
16+
// TODO(wassim): find a generic solution to proxify DomAdapter
17+
// let doc = DOM.defaultDoc();
18+
// return DOM.querySelector(doc, ...args);
19+
return prop;
20+
});
21+
}
22+
23+
let unforgeableAttributes = [
24+
"window",
25+
"document",
26+
"location",
27+
"top"
28+
].map(beDefensive);
29+
30+
let replaceableAttributes = [
31+
"self",
32+
"locationbar",
33+
"menubar",
34+
"personalbar",
35+
"scrollbars",
36+
"statusbar",
37+
"toolbar",
38+
"frames",
39+
"parent",
40+
"external",
41+
"length",
42+
43+
// CSSOM-View
44+
"screen",
45+
"scrollX",
46+
"scrollY",
47+
"pageXOffset",
48+
"pageYOffset",
49+
"innerWidth",
50+
"innerHeight",
51+
"screenX",
52+
"screenY",
53+
"outerWidth",
54+
"outerHeight",
55+
"devicePixelRatio",
56+
].map(beDefensive);
57+
58+
let methods = [
59+
"close",
60+
"stop",
61+
"focus",
62+
"blur",
63+
"open",
64+
"alert",
65+
"confirm",
66+
"prompt",
67+
"print",
68+
"postMessage",
69+
70+
// WindowBase64
71+
"btoa",
72+
"atob",
73+
74+
// WindowTimers
75+
"setTimeout",
76+
"clearTimeout",
77+
"setInterval",
78+
"clearInterval",
79+
80+
// HTML Editing APIs
81+
"getSelection",
82+
83+
// CSSOM
84+
"getComputedStyle",
85+
86+
// CSSOM-View
87+
"matchMedia",
88+
"scroll",
89+
"scrollTo",
90+
"scrollBy"
91+
].map(beDefensive);
92+
93+
let readonlyAttributes = [
94+
"history",
95+
"frameElement",
96+
"navigator",
97+
"applicationCache",
98+
99+
// WindowSessionStorage
100+
"sessionStorage",
101+
102+
// WindowLocalStorage
103+
"localStorage",
104+
].map(beDefensive);
105+
106+
let writableAttributes = [
107+
"name",
108+
"status",
109+
"opener",
110+
"onabort",
111+
"onafterprint",
112+
"onbeforeprint",
113+
"onbeforeunload",
114+
"onblur",
115+
"oncancel",
116+
"oncanplay",
117+
"oncanplaythrough",
118+
"onchange",
119+
"onclick",
120+
"onclose",
121+
"oncontextmenu",
122+
"oncuechange",
123+
"ondblclick",
124+
"ondrag",
125+
"ondragend",
126+
"ondragenter",
127+
"ondragleave",
128+
"ondragover",
129+
"ondragstart",
130+
"ondrop",
131+
"ondurationchange",
132+
"onemptied",
133+
"onended",
134+
"onerror",
135+
"onfocus",
136+
"onhashchange",
137+
"oninput",
138+
"oninvalid",
139+
"onkeydown",
140+
"onkeypress",
141+
"onkeyup",
142+
"onload",
143+
"onloadeddata",
144+
"onloadedmetadata",
145+
"onloadstart",
146+
"onmessage",
147+
"onmousedown",
148+
"onmousemove",
149+
"onmouseout",
150+
"onmouseover",
151+
"onmouseup",
152+
"onmousewheel",
153+
"onoffline",
154+
"ononline",
155+
"onpause",
156+
"onplay",
157+
"onplaying",
158+
"onpagehide",
159+
"onpageshow",
160+
"onpopstate",
161+
"onprogress",
162+
"onratechange",
163+
"onreset",
164+
"onresize",
165+
"onscroll",
166+
"onseeked",
167+
"onseeking",
168+
"onselect",
169+
"onshow",
170+
"onstalled",
171+
"onstorage",
172+
"onsubmit",
173+
"onsuspend",
174+
"ontimeupdate",
175+
"onunload",
176+
"onvolumechange",
177+
"onwaiting"
178+
].map(beDefensive);
179+
180+
export var window = win;
181+
global.window = win;
182+
GLOBAL.window = win;

0 commit comments

Comments
 (0)