Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
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 }