LoadContextInfo.cpp (5037B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #include "LoadContextInfo.h" 6 7 #include "mozilla/dom/ToJSValue.h" 8 #include "mozilla/StoragePrincipalHelper.h" 9 #include "nsDocShell.h" 10 #include "nsIChannel.h" 11 #include "nsILoadContext.h" 12 #include "nsIWebNavigation.h" 13 #include "nsNetUtil.h" 14 15 using namespace mozilla::dom; 16 namespace mozilla { 17 namespace net { 18 19 // LoadContextInfo 20 21 NS_IMPL_ISUPPORTS(LoadContextInfo, nsILoadContextInfo) 22 23 LoadContextInfo::LoadContextInfo(bool aIsAnonymous, 24 OriginAttributes aOriginAttributes) 25 : mIsAnonymous(aIsAnonymous), 26 mOriginAttributes(std::move(aOriginAttributes)) {} 27 28 NS_IMETHODIMP LoadContextInfo::GetIsPrivate(bool* aIsPrivate) { 29 *aIsPrivate = mOriginAttributes.IsPrivateBrowsing(); 30 return NS_OK; 31 } 32 33 NS_IMETHODIMP LoadContextInfo::GetIsAnonymous(bool* aIsAnonymous) { 34 *aIsAnonymous = mIsAnonymous; 35 return NS_OK; 36 } 37 38 OriginAttributes const* LoadContextInfo::OriginAttributesPtr() { 39 return &mOriginAttributes; 40 } 41 42 NS_IMETHODIMP LoadContextInfo::GetOriginAttributes( 43 JSContext* aCx, JS::MutableHandle<JS::Value> aVal) { 44 if (NS_WARN_IF(!ToJSValue(aCx, mOriginAttributes, aVal))) { 45 return NS_ERROR_FAILURE; 46 } 47 return NS_OK; 48 } 49 50 // LoadContextInfoFactory 51 52 NS_IMPL_ISUPPORTS(LoadContextInfoFactory, nsILoadContextInfoFactory) 53 54 NS_IMETHODIMP LoadContextInfoFactory::GetDefault( 55 nsILoadContextInfo** aDefault) { 56 nsCOMPtr<nsILoadContextInfo> info = 57 GetLoadContextInfo(false, OriginAttributes()); 58 info.forget(aDefault); 59 return NS_OK; 60 } 61 62 NS_IMETHODIMP LoadContextInfoFactory::GetPrivate( 63 nsILoadContextInfo** aPrivate) { 64 OriginAttributes attrs; 65 attrs.SyncAttributesWithPrivateBrowsing(true); 66 nsCOMPtr<nsILoadContextInfo> info = GetLoadContextInfo(false, attrs); 67 info.forget(aPrivate); 68 return NS_OK; 69 } 70 71 NS_IMETHODIMP LoadContextInfoFactory::GetAnonymous( 72 nsILoadContextInfo** aAnonymous) { 73 nsCOMPtr<nsILoadContextInfo> info = 74 GetLoadContextInfo(true, OriginAttributes()); 75 info.forget(aAnonymous); 76 return NS_OK; 77 } 78 79 NS_IMETHODIMP LoadContextInfoFactory::Custom( 80 bool aAnonymous, JS::Handle<JS::Value> aOriginAttributes, JSContext* cx, 81 nsILoadContextInfo** _retval) { 82 OriginAttributes attrs; 83 bool status = attrs.Init(cx, aOriginAttributes); 84 NS_ENSURE_TRUE(status, NS_ERROR_FAILURE); 85 86 nsCOMPtr<nsILoadContextInfo> info = GetLoadContextInfo(aAnonymous, attrs); 87 info.forget(_retval); 88 return NS_OK; 89 } 90 91 NS_IMETHODIMP LoadContextInfoFactory::FromLoadContext( 92 nsILoadContext* aLoadContext, bool aAnonymous, 93 nsILoadContextInfo** _retval) { 94 nsCOMPtr<nsILoadContextInfo> info = 95 GetLoadContextInfo(aLoadContext, aAnonymous); 96 info.forget(_retval); 97 return NS_OK; 98 } 99 100 NS_IMETHODIMP LoadContextInfoFactory::FromWindow(nsIDOMWindow* aWindow, 101 bool aAnonymous, 102 nsILoadContextInfo** _retval) { 103 nsCOMPtr<nsILoadContextInfo> info = GetLoadContextInfo(aWindow, aAnonymous); 104 info.forget(_retval); 105 return NS_OK; 106 } 107 108 // Helper functions 109 110 LoadContextInfo* GetLoadContextInfo(nsIChannel* aChannel) { 111 nsresult rv; 112 113 DebugOnly<bool> pb = NS_UsePrivateBrowsing(aChannel); 114 115 bool anon = false; 116 nsLoadFlags loadFlags; 117 rv = aChannel->GetLoadFlags(&loadFlags); 118 if (NS_SUCCEEDED(rv)) { 119 anon = !!(loadFlags & nsIChannel::LOAD_ANONYMOUS); 120 } 121 122 OriginAttributes oa; 123 StoragePrincipalHelper::GetOriginAttributesForNetworkState(aChannel, oa); 124 MOZ_ASSERT(pb == (oa.IsPrivateBrowsing())); 125 126 return new LoadContextInfo(anon, oa); 127 } 128 129 LoadContextInfo* GetLoadContextInfo(nsILoadContext* aLoadContext, 130 bool aIsAnonymous) { 131 if (!aLoadContext) { 132 return new LoadContextInfo(aIsAnonymous, OriginAttributes()); 133 } 134 135 OriginAttributes oa; 136 aLoadContext->GetOriginAttributes(oa); 137 138 #ifdef DEBUG 139 nsCOMPtr<nsIDocShell> docShell = do_QueryInterface(aLoadContext); 140 if (!docShell || 141 nsDocShell::Cast(docShell)->GetBrowsingContext()->IsContent()) { 142 MOZ_ASSERT(aLoadContext->UsePrivateBrowsing() == (oa.IsPrivateBrowsing())); 143 } 144 #endif 145 146 return new LoadContextInfo(aIsAnonymous, oa); 147 } 148 149 LoadContextInfo* GetLoadContextInfo(nsIDOMWindow* aWindow, bool aIsAnonymous) { 150 nsCOMPtr<nsIWebNavigation> webNav = do_GetInterface(aWindow); 151 nsCOMPtr<nsILoadContext> loadContext = do_QueryInterface(webNav); 152 153 return GetLoadContextInfo(loadContext, aIsAnonymous); 154 } 155 156 LoadContextInfo* GetLoadContextInfo(nsILoadContextInfo* aInfo) { 157 return new LoadContextInfo(aInfo->IsAnonymous(), 158 *aInfo->OriginAttributesPtr()); 159 } 160 161 LoadContextInfo* GetLoadContextInfo(bool const aIsAnonymous, 162 OriginAttributes const& aOriginAttributes) { 163 return new LoadContextInfo(aIsAnonymous, aOriginAttributes); 164 } 165 166 } // namespace net 167 } // namespace mozilla