Skip to content
This repository was archived by the owner on Jan 31, 2025. It is now read-only.

Commit 706a29a

Browse files
author
Daniel Brain
committed
Add isWindow function
1 parent 658acd4 commit 706a29a

File tree

1 file changed

+49
-4
lines changed

1 file changed

+49
-4
lines changed

src/lib/windows.js

+49-4
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,47 @@ export function isSameDomain(win) {
4040
return match;
4141
}
4242

43+
export function isWindow(item) {
44+
45+
if (!item) {
46+
return false;
47+
}
48+
49+
try {
50+
51+
for (let key of [ 'setTimeout', 'setInterval', 'postMessage', 'alert' ]) {
52+
if (typeof item[key] !== 'function') {
53+
return false;
54+
}
55+
}
56+
57+
if (!item.document || !item.location) {
58+
return false;
59+
}
60+
61+
return true;
62+
63+
} catch (err) {
64+
// pass
65+
}
66+
67+
try {
68+
69+
for (let i = 0; i < 5; i++) {
70+
if (item) {
71+
item = item[Math.random().toString()];
72+
}
73+
}
74+
75+
return false;
76+
77+
} catch (err) {
78+
79+
return true;
80+
}
81+
}
82+
83+
4384
export function isWindowClosed(win) {
4485

4586
try {
@@ -280,7 +321,7 @@ export function getFrameByName(win, name) {
280321

281322
for (let childFrame of getFrames(win)) {
282323
try {
283-
if (childFrame.name === name) {
324+
if (childFrame.name === name && isWindow(childFrame)) {
284325
return childFrame;
285326
}
286327
} catch (err) {
@@ -289,13 +330,17 @@ export function getFrameByName(win, name) {
289330
}
290331

291332
try {
292-
return win.frames[name];
333+
if (isWindow(win.frames[name])) {
334+
return win.frames[name];
335+
}
293336
} catch (err) {
294337
// pass
295338
}
296339

297340
try {
298-
return win[name];
341+
if (isWindow(win[name])) {
342+
return win[name];
343+
}
299344
} catch (err) {
300345
// pass
301346
}
@@ -437,4 +482,4 @@ export function isSameTopWindow(win1, win2) {
437482
if (opener2 && anyMatch(getAllFramesInWindow(opener2), allFrames1)) {
438483
return false;
439484
}
440-
}
485+
}

0 commit comments

Comments
 (0)