Bumping manifests a=b2g-bump
[gecko.git] / dom / base / nsDOMWindowList.cpp
blobe346632edea5547fff771845ae0a84577db7f229
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/. */
6 // Local Includes
7 #include "nsDOMWindowList.h"
9 // Helper classes
10 #include "nsCOMPtr.h"
12 // Interfaces needed
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)
36 NS_INTERFACE_MAP_END
38 NS_IMETHODIMP
39 nsDOMWindowList::SetDocShell(nsIDocShell* aDocShell)
41 mDocShellNode = aDocShell; // Weak Reference
43 return NS_OK;
46 void
47 nsDOMWindowList::EnsureFresh()
49 nsCOMPtr<nsIWebNavigation> shellAsNav = do_QueryInterface(mDocShellNode);
51 if (shellAsNav) {
52 nsCOMPtr<nsIDOMDocument> domdoc;
53 shellAsNav->GetDocument(getter_AddRefs(domdoc));
55 nsCOMPtr<nsIDocument> doc = do_QueryInterface(domdoc);
57 if (doc) {
58 doc->FlushPendingNotifications(Flush_ContentAndNotify);
63 uint32_t
64 nsDOMWindowList::GetLength()
66 EnsureFresh();
68 NS_ENSURE_TRUE(mDocShellNode, 0);
70 int32_t length;
71 nsresult rv = mDocShellNode->GetChildCount(&length);
72 NS_ENSURE_SUCCESS(rv, 0);
74 return uint32_t(length);
77 NS_IMETHODIMP
78 nsDOMWindowList::GetLength(uint32_t* aLength)
80 *aLength = GetLength();
81 return NS_OK;
84 already_AddRefed<nsIDOMWindow>
85 nsDOMWindowList::IndexedGetter(uint32_t aIndex, bool& aFound)
87 aFound = false;
89 nsCOMPtr<nsIDocShellTreeItem> item = GetDocShellTreeItemAt(aIndex);
90 if (!item) {
91 return nullptr;
94 nsCOMPtr<nsIDOMWindow> window = item->GetWindow();
95 MOZ_ASSERT(window);
97 aFound = true;
98 return window.forget();
101 NS_IMETHODIMP
102 nsDOMWindowList::Item(uint32_t aIndex, nsIDOMWindow** aReturn)
104 bool found;
105 nsCOMPtr<nsIDOMWindow> window = IndexedGetter(aIndex, found);
106 window.forget(aReturn);
107 return NS_OK;
110 NS_IMETHODIMP
111 nsDOMWindowList::NamedItem(const nsAString& aName, nsIDOMWindow** aReturn)
113 nsCOMPtr<nsIDocShellTreeItem> item;
115 *aReturn = nullptr;
117 EnsureFresh();
119 if (mDocShellNode) {
120 mDocShellNode->FindChildWithName(PromiseFlatString(aName).get(),
121 false, false, nullptr,
122 nullptr, getter_AddRefs(item));
124 nsCOMPtr<nsIScriptGlobalObject> globalObject(do_GetInterface(item));
125 if (globalObject) {
126 CallQueryInterface(globalObject.get(), aReturn);
130 return NS_OK;