File: | var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp |
Warning: | line 190, column 3 Value stored to 'result' is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | /* vim: set ts=8 sts=2 et sw=2 tw=80: */ |
3 | /* This Source Code Form is subject to the terms of the Mozilla Public |
4 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
5 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | |
7 | #include "Location.h" |
8 | #include "nsIScriptObjectPrincipal.h" |
9 | #include "nsIScriptContext.h" |
10 | #include "nsDocShellLoadState.h" |
11 | #include "nsIWebNavigation.h" |
12 | #include "nsIOService.h" |
13 | #include "nsIURL.h" |
14 | #include "nsIJARURI.h" |
15 | #include "nsIURIMutator.h" |
16 | #include "nsNetUtil.h" |
17 | #include "nsCOMPtr.h" |
18 | #include "nsEscape.h" |
19 | #include "nsPresContext.h" |
20 | #include "nsError.h" |
21 | #include "nsReadableUtils.h" |
22 | #include "nsJSUtils.h" |
23 | #include "nsContentUtils.h" |
24 | #include "nsDocShell.h" |
25 | #include "nsGlobalWindowOuter.h" |
26 | #include "nsPIDOMWindowInlines.h" |
27 | #include "mozilla/Likely.h" |
28 | #include "nsCycleCollectionParticipant.h" |
29 | #include "mozilla/BasePrincipal.h" |
30 | #include "mozilla/Components.h" |
31 | #include "mozilla/NullPrincipal.h" |
32 | #include "mozilla/ServoStyleConsts.h" |
33 | #include "mozilla/StaticPrefs_dom.h" |
34 | #include "mozilla/Unused.h" |
35 | #include "mozilla/dom/Document.h" |
36 | #include "mozilla/dom/DocumentInlines.h" |
37 | #include "mozilla/dom/FragmentDirective.h" |
38 | #include "mozilla/dom/LocationBinding.h" |
39 | #include "mozilla/dom/ScriptSettings.h" |
40 | #include "ReferrerInfo.h" |
41 | |
42 | namespace mozilla::dom { |
43 | |
44 | Location::Location(nsPIDOMWindowInner* aWindow) |
45 | : mCachedHash(VoidString()), mInnerWindow(aWindow) { |
46 | BrowsingContext* bc = GetBrowsingContext(); |
47 | if (bc) { |
48 | bc->LocationCreated(this); |
49 | } |
50 | } |
51 | |
52 | Location::~Location() { |
53 | if (isInList()) { |
54 | remove(); |
55 | } |
56 | } |
57 | |
58 | // QueryInterface implementation for Location |
59 | NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Location)nsresult Location::QueryInterface(const nsIID& aIID, void ** aInstancePtr) { do { if (!(aInstancePtr)) { NS_DebugBreak( NS_DEBUG_ASSERTION, "QueryInterface requires a non-NULL destination!" , "aInstancePtr", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 59); MOZ_PretendNoReturn(); } } while (0); nsISupports* foundInterface ; if (TopThreeWordsEquals( aIID, (nsXPCOMCycleCollectionParticipant ::COMTypeInfo<nsXPCOMCycleCollectionParticipant, void>:: kIID), (nsCycleCollectionISupports::COMTypeInfo<nsCycleCollectionISupports , void>::kIID)) && (LowWordEquals(aIID, (nsXPCOMCycleCollectionParticipant ::COMTypeInfo<nsXPCOMCycleCollectionParticipant, void>:: kIID)) || LowWordEquals(aIID, (nsCycleCollectionISupports::COMTypeInfo <nsCycleCollectionISupports, void>::kIID)))) { if (LowWordEquals (aIID, (nsXPCOMCycleCollectionParticipant::COMTypeInfo<nsXPCOMCycleCollectionParticipant , void>::kIID))) { *aInstancePtr = Location::cycleCollection ::GetParticipant(); return NS_OK; } if (LowWordEquals(aIID, ( nsCycleCollectionISupports::COMTypeInfo<nsCycleCollectionISupports , void>::kIID))) { *aInstancePtr = Location::cycleCollection ::Upcast(this); return NS_OK; } foundInterface = nullptr; } else |
60 | NS_WRAPPERCACHE_INTERFACE_MAP_ENTRYif (aIID.Equals((nsWrapperCache::COMTypeInfo<nsWrapperCache , void>::kIID))) { *aInstancePtr = static_cast<nsWrapperCache *>(this); return NS_OK; } else |
61 | NS_INTERFACE_MAP_ENTRY(nsISupports)if (aIID.Equals(mozilla::detail::kImplementedIID<std::remove_reference_t <decltype(*this)>, nsISupports>)) foundInterface = static_cast <nsISupports*>(this); else |
62 | NS_INTERFACE_MAP_ENDfoundInterface = 0; nsresult status; if (!foundInterface) { do { static_assert( mozilla::detail::AssertionConditionType< decltype(!aIID.Equals((nsISupports::COMTypeInfo<nsISupports , void>::kIID)))>::isValid, "invalid assertion condition" ); if ((__builtin_expect(!!(!(!!(!aIID.Equals((nsISupports::COMTypeInfo <nsISupports, void>::kIID))))), 0))) { do { } while (false ); MOZ_ReportAssertionFailure("!aIID.Equals((nsISupports::COMTypeInfo<nsISupports, void>::kIID))" , "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 62); AnnotateMozCrashReason("MOZ_ASSERT" "(" "!aIID.Equals((nsISupports::COMTypeInfo<nsISupports, void>::kIID))" ")"); do { *((volatile int*)__null) = 62; __attribute__((nomerge )) ::abort(); } while (false); } } while (false); status = NS_NOINTERFACE ; } else { (foundInterface)->AddRef(); status = NS_OK; } * aInstancePtr = foundInterface; return status; } |
63 | |
64 | NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(Location, mInnerWindow)static_assert(std::is_base_of<nsWrapperCache, Location> ::value, "Class should inherit nsWrapperCache"); Location::cycleCollection Location::_cycleCollectorGlobal( nsCycleCollectionParticipant ::FlagMaybeSingleZoneJSHolder); void Location::cycleCollection ::Trace( void* p, const TraceCallbacks& aCallbacks, void* aClosure) { Location* tmp = DowncastCCParticipant<Location >(p); TraceWrapper(p, aCallbacks, aClosure); (void)tmp; } void Location::cycleCollection::TraceWrapper( void* p, const TraceCallbacks & aCallbacks, void* aClosure) { Location* tmp = DowncastCCParticipant <Location>(p); tmp->TraceWrapper(aCallbacks, aClosure ); } void Location::cycleCollection::Unlink(void* p) { Location * tmp = DowncastCCParticipant<Location>(p); ImplCycleCollectionUnlink (tmp->mInnerWindow); tmp->ReleaseWrapper(p); (void)tmp; } nsresult Location::cycleCollection::TraverseNative( void* p , nsCycleCollectionTraversalCallback& cb) { Location* tmp = DowncastCCParticipant<Location>(p); cb.DescribeRefCountedNode (tmp->mRefCnt.get(), "Location"); ImplCycleCollectionTraverse (cb, tmp->mInnerWindow, "mInnerWindow", 0); (void)tmp; return NS_OK; } |
65 | |
66 | NS_IMPL_CYCLE_COLLECTING_ADDREF(Location)MozExternalRefCountType Location::AddRef(void) { static_assert (!std::is_destructible_v<Location>, "Reference-counted class " "Location" " should not have a public destructor. " "Make this class's destructor non-public" ); do { static_assert( mozilla::detail::AssertionConditionType <decltype(int32_t(mRefCnt) >= 0)>::isValid, "invalid assertion condition" ); if ((__builtin_expect(!!(!(!!(int32_t(mRefCnt) >= 0))), 0))) { do { } while (false); MOZ_ReportAssertionFailure("int32_t(mRefCnt) >= 0" " (" "illegal refcnt" ")", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 66); AnnotateMozCrashReason("MOZ_ASSERT" "(" "int32_t(mRefCnt) >= 0" ") (" "illegal refcnt" ")"); do { *((volatile int*)__null) = 66; __attribute__((nomerge)) ::abort(); } while (false); } } while (false); _mOwningThread.AssertOwnership("Location" " not thread-safe" ); nsISupports* base = Location::cycleCollection::Upcast(this ); nsrefcnt count = mRefCnt.incr(base); NS_LogAddRef((this), ( count), ("Location"), (uint32_t)(sizeof(*this))); return count ; } |
67 | NS_IMPL_CYCLE_COLLECTING_RELEASE(Location)MozExternalRefCountType Location::Release(void) { do { static_assert ( mozilla::detail::AssertionConditionType<decltype(int32_t (mRefCnt) > 0)>::isValid, "invalid assertion condition" ); if ((__builtin_expect(!!(!(!!(int32_t(mRefCnt) > 0))), 0 ))) { do { } while (false); MOZ_ReportAssertionFailure("int32_t(mRefCnt) > 0" " (" "dup release" ")", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 67); AnnotateMozCrashReason("MOZ_ASSERT" "(" "int32_t(mRefCnt) > 0" ") (" "dup release" ")"); do { *((volatile int*)__null) = 67 ; __attribute__((nomerge)) ::abort(); } while (false); } } while (false); _mOwningThread.AssertOwnership("Location" " not thread-safe" ); nsISupports* base = Location::cycleCollection::Upcast(this ); nsrefcnt count = mRefCnt.decr(base); NS_LogRelease((this), (count), ("Location")); return count; } void Location::DeleteCycleCollectable (void) { delete (this); } |
68 | |
69 | BrowsingContext* Location::GetBrowsingContext() { |
70 | return mInnerWindow ? mInnerWindow->GetBrowsingContext() : nullptr; |
71 | } |
72 | |
73 | nsIDocShell* Location::GetDocShell() { |
74 | if (BrowsingContext* bc = GetBrowsingContext()) { |
75 | return bc->GetDocShell(); |
76 | } |
77 | return nullptr; |
78 | } |
79 | |
80 | nsresult Location::GetURI(nsIURI** aURI, bool aGetInnermostURI) { |
81 | *aURI = nullptr; |
82 | |
83 | nsIDocShell* docShell = GetDocShell(); |
84 | if (!docShell) { |
85 | return NS_OK; |
86 | } |
87 | |
88 | nsIWebNavigation* webNav = nsDocShell::Cast(docShell); |
89 | |
90 | nsCOMPtr<nsIURI> uri; |
91 | nsresult rv = webNav->GetCurrentURI(getter_AddRefs(uri)); |
92 | NS_ENSURE_SUCCESS(rv, rv)do { nsresult __rv = rv; if (((bool)(__builtin_expect(!!(NS_FAILED_impl (__rv)), 0)))) { const char* name = mozilla::GetStaticErrorName (__rv); mozilla::SmprintfPointer msg = mozilla::Smprintf( "NS_ENSURE_SUCCESS(%s, %s) failed with " "result 0x%" "X" "%s%s%s", "rv", "rv", static_cast<uint32_t >(__rv), name ? " (" : "", name ? name : "", name ? ")" : "" ); NS_DebugBreak(NS_DEBUG_WARNING, msg.get(), nullptr, "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 92); return rv; } } while (false); |
93 | |
94 | // It is valid for docshell to return a null URI. Don't try to fixup |
95 | // if this happens. |
96 | if (!uri) { |
97 | return NS_OK; |
98 | } |
99 | |
100 | if (aGetInnermostURI) { |
101 | nsCOMPtr<nsIJARURI> jarURI(do_QueryInterface(uri)); |
102 | while (jarURI) { |
103 | jarURI->GetJARFile(getter_AddRefs(uri)); |
104 | jarURI = do_QueryInterface(uri); |
105 | } |
106 | } |
107 | |
108 | NS_ASSERTION(uri, "nsJARURI screwed up?")do { if (!(uri)) { NS_DebugBreak(NS_DEBUG_ASSERTION, "nsJARURI screwed up?" , "uri", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 108); MOZ_PretendNoReturn(); } } while (0); |
109 | |
110 | // Remove the fragment directive from the url hash. |
111 | FragmentDirective::ParseAndRemoveFragmentDirectiveFromFragment(uri); |
112 | nsCOMPtr<nsIURI> exposableURI = net::nsIOService::CreateExposableURI(uri); |
113 | exposableURI.forget(aURI); |
114 | return NS_OK; |
115 | } |
116 | |
117 | void Location::GetHash(nsAString& aHash, nsIPrincipal& aSubjectPrincipal, |
118 | ErrorResult& aRv) { |
119 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
120 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
121 | return; |
122 | } |
123 | |
124 | if (!mCachedHash.IsVoid()) { |
125 | aHash = mCachedHash; |
126 | return; |
127 | } |
128 | |
129 | aHash.SetLength(0); |
130 | |
131 | nsCOMPtr<nsIURI> uri; |
132 | aRv = GetURI(getter_AddRefs(uri)); |
133 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 133) || !uri) { |
134 | return; |
135 | } |
136 | |
137 | nsAutoCString ref; |
138 | |
139 | aRv = uri->GetRef(ref); |
140 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 140)) { |
141 | return; |
142 | } |
143 | |
144 | if (!ref.IsEmpty()) { |
145 | aHash.Assign(char16_t('#')); |
146 | AppendUTF8toUTF16(ref, aHash); |
147 | } |
148 | |
149 | mCachedHash = aHash; |
150 | } |
151 | |
152 | void Location::SetHash(const nsAString& aHash, nsIPrincipal& aSubjectPrincipal, |
153 | ErrorResult& aRv) { |
154 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
155 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
156 | return; |
157 | } |
158 | |
159 | NS_ConvertUTF16toUTF8 hash(aHash); |
160 | if (hash.IsEmpty() || hash.First() != char16_t('#')) { |
161 | hash.Insert(char16_t('#'), 0); |
162 | } |
163 | |
164 | nsCOMPtr<nsIURI> uri; |
165 | aRv = GetURI(getter_AddRefs(uri)); |
166 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 166) || !uri) { |
167 | return; |
168 | } |
169 | |
170 | aRv = NS_MutateURI(uri).SetRef(hash).Finalize(uri); |
171 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 171) || !uri) { |
172 | return; |
173 | } |
174 | |
175 | SetURI(uri, aSubjectPrincipal, aRv); |
176 | } |
177 | |
178 | void Location::GetHost(nsAString& aHost, nsIPrincipal& aSubjectPrincipal, |
179 | ErrorResult& aRv) { |
180 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
181 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
182 | return; |
183 | } |
184 | |
185 | aHost.Truncate(); |
186 | |
187 | nsCOMPtr<nsIURI> uri; |
188 | nsresult result; |
189 | |
190 | result = GetURI(getter_AddRefs(uri), true); |
Value stored to 'result' is never read | |
191 | |
192 | if (uri) { |
193 | nsAutoCString hostport; |
194 | |
195 | result = uri->GetHostPort(hostport); |
196 | |
197 | if (NS_SUCCEEDED(result)((bool)(__builtin_expect(!!(!NS_FAILED_impl(result)), 1)))) { |
198 | AppendUTF8toUTF16(hostport, aHost); |
199 | } |
200 | } |
201 | } |
202 | |
203 | void Location::SetHost(const nsAString& aHost, nsIPrincipal& aSubjectPrincipal, |
204 | ErrorResult& aRv) { |
205 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
206 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
207 | return; |
208 | } |
209 | |
210 | nsCOMPtr<nsIURI> uri; |
211 | aRv = GetURI(getter_AddRefs(uri)); |
212 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 212) || !uri) { |
213 | return; |
214 | } |
215 | |
216 | aRv = |
217 | NS_MutateURI(uri).SetHostPort(NS_ConvertUTF16toUTF8(aHost)).Finalize(uri); |
218 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 218)) { |
219 | return; |
220 | } |
221 | |
222 | SetURI(uri, aSubjectPrincipal, aRv); |
223 | } |
224 | |
225 | void Location::GetHostname(nsAString& aHostname, |
226 | nsIPrincipal& aSubjectPrincipal, ErrorResult& aRv) { |
227 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
228 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
229 | return; |
230 | } |
231 | |
232 | aHostname.Truncate(); |
233 | |
234 | nsCOMPtr<nsIURI> uri; |
235 | GetURI(getter_AddRefs(uri), true); |
236 | if (uri) { |
237 | nsContentUtils::GetHostOrIPv6WithBrackets(uri, aHostname); |
238 | } |
239 | } |
240 | |
241 | void Location::SetHostname(const nsAString& aHostname, |
242 | nsIPrincipal& aSubjectPrincipal, ErrorResult& aRv) { |
243 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
244 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
245 | return; |
246 | } |
247 | |
248 | nsCOMPtr<nsIURI> uri; |
249 | aRv = GetURI(getter_AddRefs(uri)); |
250 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 250) || !uri) { |
251 | return; |
252 | } |
253 | |
254 | aRv = |
255 | NS_MutateURI(uri).SetHost(NS_ConvertUTF16toUTF8(aHostname)).Finalize(uri); |
256 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 256)) { |
257 | return; |
258 | } |
259 | |
260 | SetURI(uri, aSubjectPrincipal, aRv); |
261 | } |
262 | |
263 | nsresult Location::GetHref(nsAString& aHref) { |
264 | aHref.Truncate(); |
265 | |
266 | nsCOMPtr<nsIURI> uri; |
267 | nsresult rv = GetURI(getter_AddRefs(uri)); |
268 | if (NS_WARN_IF(NS_FAILED(rv))NS_warn_if_impl(((bool)(__builtin_expect(!!(NS_FAILED_impl(rv )), 0))), "NS_FAILED(rv)", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 268) || !uri) { |
269 | return rv; |
270 | } |
271 | |
272 | nsAutoCString uriString; |
273 | rv = uri->GetSpec(uriString); |
274 | if (NS_WARN_IF(NS_FAILED(rv))NS_warn_if_impl(((bool)(__builtin_expect(!!(NS_FAILED_impl(rv )), 0))), "NS_FAILED(rv)", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 274)) { |
275 | return rv; |
276 | } |
277 | |
278 | AppendUTF8toUTF16(uriString, aHref); |
279 | return NS_OK; |
280 | } |
281 | |
282 | void Location::GetOrigin(nsAString& aOrigin, nsIPrincipal& aSubjectPrincipal, |
283 | ErrorResult& aRv) { |
284 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
285 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
286 | return; |
287 | } |
288 | |
289 | aOrigin.Truncate(); |
290 | |
291 | nsCOMPtr<nsIURI> uri; |
292 | aRv = GetURI(getter_AddRefs(uri), true); |
293 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 293) || !uri) { |
294 | return; |
295 | } |
296 | |
297 | nsAutoString origin; |
298 | aRv = nsContentUtils::GetWebExposedOriginSerialization(uri, origin); |
299 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 299)) { |
300 | return; |
301 | } |
302 | |
303 | aOrigin = origin; |
304 | } |
305 | |
306 | void Location::GetPathname(nsAString& aPathname, |
307 | nsIPrincipal& aSubjectPrincipal, ErrorResult& aRv) { |
308 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
309 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
310 | return; |
311 | } |
312 | |
313 | aPathname.Truncate(); |
314 | |
315 | nsCOMPtr<nsIURI> uri; |
316 | aRv = GetURI(getter_AddRefs(uri)); |
317 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 317) || !uri) { |
318 | return; |
319 | } |
320 | |
321 | nsAutoCString file; |
322 | |
323 | aRv = uri->GetFilePath(file); |
324 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 324)) { |
325 | return; |
326 | } |
327 | |
328 | AppendUTF8toUTF16(file, aPathname); |
329 | } |
330 | |
331 | void Location::SetPathname(const nsAString& aPathname, |
332 | nsIPrincipal& aSubjectPrincipal, ErrorResult& aRv) { |
333 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
334 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
335 | return; |
336 | } |
337 | |
338 | nsCOMPtr<nsIURI> uri; |
339 | aRv = GetURI(getter_AddRefs(uri)); |
340 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 340) || !uri) { |
341 | return; |
342 | } |
343 | |
344 | nsresult rv = NS_MutateURI(uri) |
345 | .SetFilePath(NS_ConvertUTF16toUTF8(aPathname)) |
346 | .Finalize(uri); |
347 | if (NS_FAILED(rv)((bool)(__builtin_expect(!!(NS_FAILED_impl(rv)), 0)))) { |
348 | return; |
349 | } |
350 | |
351 | SetURI(uri, aSubjectPrincipal, aRv); |
352 | } |
353 | |
354 | void Location::GetPort(nsAString& aPort, nsIPrincipal& aSubjectPrincipal, |
355 | ErrorResult& aRv) { |
356 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
357 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
358 | return; |
359 | } |
360 | |
361 | aPort.SetLength(0); |
362 | |
363 | nsCOMPtr<nsIURI> uri; |
364 | aRv = GetURI(getter_AddRefs(uri), true); |
365 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 365) || !uri) { |
366 | return; |
367 | } |
368 | |
369 | int32_t port; |
370 | nsresult result = uri->GetPort(&port); |
371 | |
372 | // Don't propagate this exception to caller |
373 | if (NS_SUCCEEDED(result)((bool)(__builtin_expect(!!(!NS_FAILED_impl(result)), 1))) && -1 != port) { |
374 | nsAutoString portStr; |
375 | portStr.AppendInt(port); |
376 | aPort.Append(portStr); |
377 | } |
378 | } |
379 | |
380 | void Location::SetPort(const nsAString& aPort, nsIPrincipal& aSubjectPrincipal, |
381 | ErrorResult& aRv) { |
382 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
383 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
384 | return; |
385 | } |
386 | |
387 | nsCOMPtr<nsIURI> uri; |
388 | aRv = GetURI(getter_AddRefs(uri)); |
389 | if (NS_WARN_IF(aRv.Failed() || !uri)NS_warn_if_impl(aRv.Failed() || !uri, "aRv.Failed() || !uri", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 389)) { |
390 | return; |
391 | } |
392 | |
393 | // perhaps use nsReadingIterators at some point? |
394 | NS_ConvertUTF16toUTF8 portStr(aPort); |
395 | const char* buf = portStr.get(); |
396 | int32_t port = -1; |
397 | |
398 | if (!portStr.IsEmpty() && buf) { |
399 | if (*buf == ':') { |
400 | port = atol(buf + 1); |
401 | } else { |
402 | port = atol(buf); |
403 | } |
404 | } |
405 | |
406 | aRv = NS_MutateURI(uri).SetPort(port).Finalize(uri); |
407 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 407)) { |
408 | return; |
409 | } |
410 | |
411 | SetURI(uri, aSubjectPrincipal, aRv); |
412 | } |
413 | |
414 | void Location::GetProtocol(nsAString& aProtocol, |
415 | nsIPrincipal& aSubjectPrincipal, ErrorResult& aRv) { |
416 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
417 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
418 | return; |
419 | } |
420 | |
421 | aProtocol.SetLength(0); |
422 | |
423 | nsCOMPtr<nsIURI> uri; |
424 | aRv = GetURI(getter_AddRefs(uri)); |
425 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 425) || !uri) { |
426 | return; |
427 | } |
428 | |
429 | nsAutoCString protocol; |
430 | |
431 | aRv = uri->GetScheme(protocol); |
432 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 432)) { |
433 | return; |
434 | } |
435 | |
436 | CopyASCIItoUTF16(protocol, aProtocol); |
437 | aProtocol.Append(char16_t(':')); |
438 | } |
439 | |
440 | void Location::SetProtocol(const nsAString& aProtocol, |
441 | nsIPrincipal& aSubjectPrincipal, ErrorResult& aRv) { |
442 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
443 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
444 | return; |
445 | } |
446 | |
447 | nsCOMPtr<nsIURI> uri; |
448 | aRv = GetURI(getter_AddRefs(uri)); |
449 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 449) || !uri) { |
450 | return; |
451 | } |
452 | |
453 | nsAString::const_iterator start, end; |
454 | aProtocol.BeginReading(start); |
455 | aProtocol.EndReading(end); |
456 | nsAString::const_iterator iter(start); |
457 | Unused << FindCharInReadable(':', iter, end); |
458 | |
459 | nsresult rv = NS_MutateURI(uri) |
460 | .SetScheme(NS_ConvertUTF16toUTF8(Substring(start, iter))) |
461 | .Finalize(uri); |
462 | if (NS_WARN_IF(NS_FAILED(rv))NS_warn_if_impl(((bool)(__builtin_expect(!!(NS_FAILED_impl(rv )), 0))), "NS_FAILED(rv)", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 462)) { |
463 | // Oh, I wish nsStandardURL returned NS_ERROR_MALFORMED_URI for _all_ the |
464 | // malformed cases, not just some of them! |
465 | aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR); |
466 | return; |
467 | } |
468 | |
469 | nsAutoCString newSpec; |
470 | aRv = uri->GetSpec(newSpec); |
471 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 471)) { |
472 | return; |
473 | } |
474 | // We may want a new URI class for the new URI, so recreate it: |
475 | rv = NS_NewURI(getter_AddRefs(uri), newSpec); |
476 | if (NS_FAILED(rv)((bool)(__builtin_expect(!!(NS_FAILED_impl(rv)), 0)))) { |
477 | if (rv == NS_ERROR_MALFORMED_URI) { |
478 | rv = NS_ERROR_DOM_SYNTAX_ERR; |
479 | } |
480 | |
481 | aRv.Throw(rv); |
482 | return; |
483 | } |
484 | |
485 | if (!uri->SchemeIs("http") && !uri->SchemeIs("https")) { |
486 | // No-op, per spec. |
487 | return; |
488 | } |
489 | |
490 | SetURI(uri, aSubjectPrincipal, aRv); |
491 | } |
492 | |
493 | void Location::GetSearch(nsAString& aSearch, nsIPrincipal& aSubjectPrincipal, |
494 | ErrorResult& aRv) { |
495 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
496 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
497 | return; |
498 | } |
499 | |
500 | aSearch.SetLength(0); |
501 | |
502 | nsCOMPtr<nsIURI> uri; |
503 | nsresult result = NS_OK; |
504 | |
505 | result = GetURI(getter_AddRefs(uri)); |
506 | |
507 | nsCOMPtr<nsIURL> url(do_QueryInterface(uri)); |
508 | |
509 | if (url) { |
510 | nsAutoCString search; |
511 | |
512 | result = url->GetQuery(search); |
513 | |
514 | if (NS_SUCCEEDED(result)((bool)(__builtin_expect(!!(!NS_FAILED_impl(result)), 1))) && !search.IsEmpty()) { |
515 | aSearch.Assign(char16_t('?')); |
516 | AppendUTF8toUTF16(search, aSearch); |
517 | } |
518 | } |
519 | } |
520 | |
521 | void Location::SetSearch(const nsAString& aSearch, |
522 | nsIPrincipal& aSubjectPrincipal, ErrorResult& aRv) { |
523 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
524 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
525 | return; |
526 | } |
527 | |
528 | nsCOMPtr<nsIURI> uri; |
529 | aRv = GetURI(getter_AddRefs(uri)); |
530 | nsCOMPtr<nsIURL> url(do_QueryInterface(uri)); |
531 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 531) || !url) { |
532 | return; |
533 | } |
534 | |
535 | aRv = |
536 | NS_MutateURI(uri).SetQuery(NS_ConvertUTF16toUTF8(aSearch)).Finalize(uri); |
537 | if (NS_WARN_IF(aRv.Failed())NS_warn_if_impl(aRv.Failed(), "aRv.Failed()", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 537)) { |
538 | return; |
539 | } |
540 | |
541 | SetURI(uri, aSubjectPrincipal, aRv); |
542 | } |
543 | |
544 | void Location::Reload(bool aForceget, nsIPrincipal& aSubjectPrincipal, |
545 | ErrorResult& aRv) { |
546 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
547 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
548 | return; |
549 | } |
550 | |
551 | RefPtr<nsDocShell> docShell(nsDocShell::Cast(GetDocShell())); |
552 | if (!docShell) { |
553 | return aRv.Throw(NS_ERROR_FAILURE); |
554 | } |
555 | |
556 | RefPtr<BrowsingContext> bc = GetBrowsingContext(); |
557 | if (!bc || bc->IsDiscarded()) { |
558 | return; |
559 | } |
560 | |
561 | CallerType callerType = aSubjectPrincipal.IsSystemPrincipal() |
562 | ? CallerType::System |
563 | : CallerType::NonSystem; |
564 | |
565 | nsresult rv = bc->CheckNavigationRateLimit(callerType); |
566 | if (NS_FAILED(rv)((bool)(__builtin_expect(!!(NS_FAILED_impl(rv)), 0)))) { |
567 | aRv.Throw(rv); |
568 | return; |
569 | } |
570 | |
571 | uint32_t reloadFlags = nsIWebNavigation::LOAD_FLAGS_NONE; |
572 | |
573 | if (aForceget) { |
574 | reloadFlags = nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE | |
575 | nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY; |
576 | } |
577 | |
578 | rv = docShell->Reload(reloadFlags); |
579 | if (NS_FAILED(rv)((bool)(__builtin_expect(!!(NS_FAILED_impl(rv)), 0))) && rv != NS_BINDING_ABORTED) { |
580 | // NS_BINDING_ABORTED is returned when we attempt to reload a POST result |
581 | // and the user says no at the "do you want to reload?" prompt. Don't |
582 | // propagate this one back to callers. |
583 | return aRv.Throw(rv); |
584 | } |
585 | } |
586 | |
587 | void Location::Assign(const nsAString& aUrl, nsIPrincipal& aSubjectPrincipal, |
588 | ErrorResult& aRv) { |
589 | if (!CallerSubsumes(&aSubjectPrincipal)) { |
590 | aRv.Throw(NS_ERROR_DOM_SECURITY_ERR); |
591 | return; |
592 | } |
593 | |
594 | DoSetHref(aUrl, aSubjectPrincipal, false, aRv); |
595 | } |
596 | |
597 | bool Location::CallerSubsumes(nsIPrincipal* aSubjectPrincipal) { |
598 | MOZ_ASSERT(aSubjectPrincipal)do { static_assert( mozilla::detail::AssertionConditionType< decltype(aSubjectPrincipal)>::isValid, "invalid assertion condition" ); if ((__builtin_expect(!!(!(!!(aSubjectPrincipal))), 0))) { do { } while (false); MOZ_ReportAssertionFailure("aSubjectPrincipal" , "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 598); AnnotateMozCrashReason("MOZ_ASSERT" "(" "aSubjectPrincipal" ")"); do { *((volatile int*)__null) = 598; __attribute__((nomerge )) ::abort(); } while (false); } } while (false); |
599 | |
600 | BrowsingContext* bc = GetBrowsingContext(); |
601 | if (MOZ_UNLIKELY(!bc)(__builtin_expect(!!(!bc), 0)) || MOZ_UNLIKELY(bc->IsDiscarded())(__builtin_expect(!!(bc->IsDiscarded()), 0))) { |
602 | // Per spec, operations on a Location object with a discarded BC are no-ops, |
603 | // not security errors, so we need to return true from the access check and |
604 | // let the caller do its own discarded docShell check. |
605 | return true; |
606 | } |
607 | if (MOZ_UNLIKELY(!bc->IsInProcess())(__builtin_expect(!!(!bc->IsInProcess()), 0))) { |
608 | return false; |
609 | } |
610 | |
611 | // Get the principal associated with the location object. Note that this is |
612 | // the principal of the page which will actually be navigated, not the |
613 | // principal of the Location object itself. This is why we need this check |
614 | // even though we only allow limited cross-origin access to Location objects |
615 | // in general. |
616 | nsPIDOMWindowOuter* outer = bc->GetDOMWindow(); |
617 | MOZ_DIAGNOSTIC_ASSERT(outer)do { static_assert( mozilla::detail::AssertionConditionType< decltype(outer)>::isValid, "invalid assertion condition"); if ((__builtin_expect(!!(!(!!(outer))), 0))) { do { } while ( false); MOZ_ReportAssertionFailure("outer", "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 617); AnnotateMozCrashReason("MOZ_DIAGNOSTIC_ASSERT" "(" "outer" ")"); do { *((volatile int*)__null) = 617; __attribute__((nomerge )) ::abort(); } while (false); } } while (false); |
618 | if (MOZ_UNLIKELY(!outer)(__builtin_expect(!!(!outer), 0))) return false; |
619 | |
620 | nsIScriptObjectPrincipal* sop = nsGlobalWindowOuter::Cast(outer); |
621 | bool subsumes = false; |
622 | nsresult rv = aSubjectPrincipal->SubsumesConsideringDomain( |
623 | sop->GetPrincipal(), &subsumes); |
624 | NS_ENSURE_SUCCESS(rv, false)do { nsresult __rv = rv; if (((bool)(__builtin_expect(!!(NS_FAILED_impl (__rv)), 0)))) { const char* name = mozilla::GetStaticErrorName (__rv); mozilla::SmprintfPointer msg = mozilla::Smprintf( "NS_ENSURE_SUCCESS(%s, %s) failed with " "result 0x%" "X" "%s%s%s", "rv", "false", static_cast<uint32_t >(__rv), name ? " (" : "", name ? name : "", name ? ")" : "" ); NS_DebugBreak(NS_DEBUG_WARNING, msg.get(), nullptr, "/var/lib/jenkins/workspace/firefox-scan-build/dom/base/Location.cpp" , 624); return false; } } while (false); |
625 | return subsumes; |
626 | } |
627 | |
628 | JSObject* Location::WrapObject(JSContext* aCx, |
629 | JS::Handle<JSObject*> aGivenProto) { |
630 | return Location_Binding::Wrap(aCx, this, aGivenProto); |
631 | } |
632 | |
633 | void Location::ClearCachedValues() { mCachedHash = VoidString(); } |
634 | |
635 | } // namespace mozilla::dom |