diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index c5c2e784ff3..40df40c9979 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -177,8 +177,27 @@ static HRESULT WINAPI HTMLWindow2_item(IHTMLWindow2 *iface, VARIANT *pvarIndex,
static HRESULT WINAPI HTMLWindow2_get_length(IHTMLWindow2 *iface, LONG *p)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ nsIDOMWindowCollection *nscollection;
+ PRUint32 length;
+ nsresult nsres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ nsres = nsIDOMWindow_GetFrames(This->nswindow, &nscollection);
+ if(NS_FAILED(nsres)) {
+ ERR("GetFrames failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ nsres = nsIDOMWindowCollection_GetLength(nscollection, &length);
+ nsIDOMWindowCollection_Release(nscollection);
+ if(NS_FAILED(nsres)) {
+ ERR("GetLength failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ *p = length;
+ return S_OK;
}
static HRESULT WINAPI HTMLWindow2_get_frames(IHTMLWindow2 *iface, IHTMLFramesCollection2 **p)
diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl
index 571c0230b09..7429c60d3a0 100644
--- a/dlls/mshtml/nsiface.idl
+++ b/dlls/mshtml/nsiface.idl
@@ -89,6 +89,7 @@ interface nsIDocumentStateListener;
interface nsIDOMCSSStyleSheet;
interface nsIDOMDocumentView;
interface nsIDocumentObserver;
+interface nsIDOMWindow;
interface IMoniker;
@@ -109,7 +110,6 @@ typedef nsISupports nsISHistory;
typedef nsISupports nsIWidget;
typedef nsISupports nsIHttpHeaderVisitor;
typedef nsISupports nsIDOMBarProp;
-typedef nsISupports nsIDOMWindowCollection;
typedef nsISupports nsIPrompt;
typedef nsISupports nsIAuthPrompt;
typedef nsISupports nsIDOMNamedNodeMap;
@@ -1106,6 +1106,19 @@ interface nsISelection : nsISupports
nsresult ToString(PRUnichar **_retval);
}
+[
+ object,
+ uuid(a6cf906f-15b3-11d2-932e-00805f8add32),
+ local
+ /* FROZEN */
+]
+interface nsIDOMWindowCollection : nsISupports
+{
+ nsresult GetLength(PRUint32 *aLength);
+ nsresult Item(PRUint32 index, nsIDOMWindow **_retval);
+ nsresult NamedItem(const nsAString *name, nsIDOMWindow **_retval);
+}
+
[
object,
uuid(a6cf906b-15b3-11d2-932e-00805f8add32),
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index bb974295971..f826a0177c1 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -851,6 +851,16 @@ static void _set_window_name(unsigned line, IHTMLWindow2 *window, const char *na
_test_window_name(line, window, name);
}
+#define test_window_length(w,l) _test_window_length(__LINE__,w,l)
+static void _test_window_length(unsigned line, IHTMLWindow2 *window, LONG exlen)
+{
+ LONG length = -1;
+ HRESULT hres;
+
+ hres = IHTMLWindow2_get_length(window, &length);
+ ok_(__FILE__,line)(hres == S_OK, "get_length failed: %08x\n", hres);
+ ok_(__FILE__,line)(length == exlen, "length = %d, expected %d\n", length, exlen);
+}
static void test_get_set_attr(IHTMLDocument2 *doc)
{
@@ -4414,6 +4424,7 @@ static void test_window(IHTMLDocument2 *doc)
test_window_name(window, NULL);
set_window_name(window, "test");
+ test_window_length(window, 0);
IHTMLWindow2_Release(window);
}
@@ -4648,6 +4659,8 @@ static void test_iframe_elem(IHTMLElement *elem)
ok(hres == S_OK, "get_contentWindow failed: %08x\n", hres);
ok(content_window != NULL, "contentWindow = NULL\n");
+ test_window_length(content_window, 0);
+
content_doc = NULL;
hres = IHTMLWindow2_get_document(content_window, &content_doc);
IHTMLWindow2_Release(content_window);
@@ -5202,6 +5215,7 @@ static void test_elems(IHTMLDocument2 *doc)
window = get_doc_window(doc);
test_window_name(window, NULL);
set_window_name(window, "test name");
+ test_window_length(window, 1);
IHTMLWindow2_Release(window);
}