dom/base/nsDOMWindowList.cpp

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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)
    22 {
    23   SetDocShell(aDocShell);
    24 }
    26 nsDOMWindowList::~nsDOMWindowList()
    27 {
    28 }
    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)
    40 {
    41   mDocShellNode = aDocShell; // Weak Reference
    43   return NS_OK;
    44 }
    46 void
    47 nsDOMWindowList::EnsureFresh()
    48 {
    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);
    59     }
    60   }
    61 }
    63 uint32_t
    64 nsDOMWindowList::GetLength()
    65 {
    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);
    75 }
    77 NS_IMETHODIMP 
    78 nsDOMWindowList::GetLength(uint32_t* aLength)
    79 {
    80   *aLength = GetLength();
    81   return NS_OK;
    82 }
    84 already_AddRefed<nsIDOMWindow>
    85 nsDOMWindowList::IndexedGetter(uint32_t aIndex, bool& aFound)
    86 {
    87   aFound = false;
    89   nsCOMPtr<nsIDocShellTreeItem> item = GetDocShellTreeItemAt(aIndex);
    90   if (!item) {
    91     return nullptr;
    92   }
    94   nsCOMPtr<nsIDOMWindow> window = do_GetInterface(item);
    95   MOZ_ASSERT(window);
    97   aFound = true;
    98   return window.forget();
    99 }
   101 NS_IMETHODIMP 
   102 nsDOMWindowList::Item(uint32_t aIndex, nsIDOMWindow** aReturn)
   103 {
   104   bool found;
   105   nsCOMPtr<nsIDOMWindow> window = IndexedGetter(aIndex, found);
   106   window.forget(aReturn);
   107   return NS_OK;
   108 }
   110 NS_IMETHODIMP 
   111 nsDOMWindowList::NamedItem(const nsAString& aName, nsIDOMWindow** aReturn)
   112 {
   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);
   127     }
   128   }
   130   return NS_OK;
   131 }

mercurial