1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "nsDOMWindowList.h"
13 #include "nsIDocument.h"
14 #include "nsIDOMDocument.h"
15 #include "nsIDOMWindow.h"
16 #include "nsIDocShell.h"
17 #include "nsIInterfaceRequestorUtils.h"
18 #include "nsIScriptGlobalObject.h"
19 #include "nsIWebNavigation.h"
21 nsDOMWindowList::nsDOMWindowList(nsIDocShell
*aDocShell
)
23 SetDocShell(aDocShell
);
26 nsDOMWindowList::~nsDOMWindowList()
30 NS_IMPL_ADDREF(nsDOMWindowList
)
31 NS_IMPL_RELEASE(nsDOMWindowList
)
33 NS_INTERFACE_MAP_BEGIN(nsDOMWindowList
)
34 NS_INTERFACE_MAP_ENTRY(nsIDOMWindowCollection
)
35 NS_INTERFACE_MAP_ENTRY(nsISupports
)
39 nsDOMWindowList::SetDocShell(nsIDocShell
* aDocShell
)
41 nsCOMPtr
<nsIDocShellTreeNode
> docShellAsNode(do_QueryInterface(aDocShell
));
42 mDocShellNode
= docShellAsNode
; // Weak Reference
48 nsDOMWindowList::EnsureFresh()
50 nsCOMPtr
<nsIWebNavigation
> shellAsNav
= do_QueryInterface(mDocShellNode
);
53 nsCOMPtr
<nsIDOMDocument
> domdoc
;
54 shellAsNav
->GetDocument(getter_AddRefs(domdoc
));
56 nsCOMPtr
<nsIDocument
> doc
= do_QueryInterface(domdoc
);
59 doc
->FlushPendingNotifications(Flush_ContentAndNotify
);
65 nsDOMWindowList::GetLength()
69 NS_ENSURE_TRUE(mDocShellNode
, 0);
72 nsresult rv
= mDocShellNode
->GetChildCount(&length
);
73 NS_ENSURE_SUCCESS(rv
, 0);
75 return uint32_t(length
);
79 nsDOMWindowList::GetLength(uint32_t* aLength
)
81 *aLength
= GetLength();
85 already_AddRefed
<nsIDOMWindow
>
86 nsDOMWindowList::IndexedGetter(uint32_t aIndex
, bool& aFound
)
90 nsCOMPtr
<nsIDocShellTreeItem
> item
= GetDocShellTreeItemAt(aIndex
);
95 nsCOMPtr
<nsIDOMWindow
> window
= do_GetInterface(item
);
99 return window
.forget();
103 nsDOMWindowList::Item(uint32_t aIndex
, nsIDOMWindow
** aReturn
)
106 nsCOMPtr
<nsIDOMWindow
> window
= IndexedGetter(aIndex
, found
);
107 window
.forget(aReturn
);
112 nsDOMWindowList::NamedItem(const nsAString
& aName
, nsIDOMWindow
** aReturn
)
114 nsCOMPtr
<nsIDocShellTreeItem
> item
;
121 mDocShellNode
->FindChildWithName(PromiseFlatString(aName
).get(),
122 false, false, nullptr,
123 nullptr, getter_AddRefs(item
));
125 nsCOMPtr
<nsIScriptGlobalObject
> globalObject(do_GetInterface(item
));
127 CallQueryInterface(globalObject
.get(), aReturn
);