Skip to content
This repository was archived by the owner on Jul 9, 2025. It is now read-only.

Commit 9772199

Browse files
committed
Bug 1942630, part 2 - Navigation API: Implement user navigation involvement in nsDocShellLoadState and nsILoadInfo. r=farre,necko-reviewers,kershaw
This patch introduces `UserNavigationInvolvement` as an IPDL type, and adds the user navigation involvement flag to `nsDocShellLoadState` and `nsILoadInfo`. Differential Revision: https://phabricator.services.mozilla.com/D234851
1 parent 575bc2e commit 9772199

File tree

11 files changed

+109
-6
lines changed

11 files changed

+109
-6
lines changed

docshell/base/nsDocShellLoadState.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,16 @@ void nsDocShellLoadState::SetLoadType(uint32_t aLoadType) {
695695
mLoadType = aLoadType;
696696
}
697697

698+
mozilla::dom::UserNavigationInvolvement
699+
nsDocShellLoadState::UserNavigationInvolvement() const {
700+
return mUserNavigationInvolvement;
701+
}
702+
703+
void nsDocShellLoadState::SetUserNavigationInvolvement(
704+
mozilla::dom::UserNavigationInvolvement aUserNavigationInvolvement) {
705+
mUserNavigationInvolvement = aUserNavigationInvolvement;
706+
}
707+
698708
nsISHEntry* nsDocShellLoadState::SHEntry() const { return mSHEntry; }
699709

700710
void nsDocShellLoadState::SetSHEntry(nsISHEntry* aSHEntry) {
@@ -1326,6 +1336,7 @@ DocShellLoadStateInit nsDocShellLoadState::Serialize(
13261336
loadState.ShouldCheckForRecursion() = mShouldCheckForRecursion;
13271337
loadState.IsFormSubmission() = mIsFormSubmission;
13281338
loadState.LoadType() = mLoadType;
1339+
loadState.userNavigationInvolvement() = mUserNavigationInvolvement;
13291340
loadState.Target() = mTarget;
13301341
loadState.TargetBrowsingContext() = mTargetBrowsingContext;
13311342
loadState.LoadFlags() = mLoadFlags;

docshell/base/nsDocShellLoadState.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "mozilla/dom/BrowsingContext.h"
1111
#include "mozilla/dom/SessionHistoryEntry.h"
12+
#include "mozilla/dom/UserNavigationInvolvement.h"
1213

1314
#include "nsILoadInfo.h"
1415

@@ -172,6 +173,11 @@ class nsDocShellLoadState final {
172173

173174
void SetLoadType(uint32_t aLoadType);
174175

176+
mozilla::dom::UserNavigationInvolvement UserNavigationInvolvement() const;
177+
178+
void SetUserNavigationInvolvement(
179+
mozilla::dom::UserNavigationInvolvement aUserNavigationInvolvement);
180+
175181
nsISHEntry* SHEntry() const;
176182

177183
void SetSHEntry(nsISHEntry* aSHEntry);
@@ -532,6 +538,10 @@ class nsDocShellLoadState final {
532538
// constants
533539
uint32_t mLoadType;
534540

541+
// https://html.spec.whatwg.org/#user-navigation-involvement
542+
mozilla::dom::UserNavigationInvolvement mUserNavigationInvolvement =
543+
mozilla::dom::UserNavigationInvolvement::None;
544+
535545
// Active Session History entry (if loading from SH)
536546
nsCOMPtr<nsISHEntry> mSHEntry;
537547

dom/ipc/DOMTypes.ipdlh

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ include "mozilla/dom/DomSecurityIPCUtils.h";
88
include "mozilla/GfxMessageUtils.h";
99
include "mozilla/dom/CSPMessageUtils.h";
1010
include "mozilla/dom/DocShellMessageUtils.h";
11+
include "mozilla/dom/NavigationAPIIPCUtils.h";
1112
include "mozilla/dom/PermissionMessageUtils.h";
1213
include "mozilla/dom/PropertyBagUtils.h";
1314
include "mozilla/dom/ReferrerInfoUtils.h";
@@ -58,6 +59,7 @@ using mozilla::TimeStamp from "mozilla/TimeStamp.h";
5859
[RefCounted] using class mozilla::RemoteLazyInputStream from "mozilla/RemoteLazyInputStream.h";
5960
[MoveOnly] using class mozilla::ipc::BigBuffer from "mozilla/ipc/BigBuffer.h";
6061
using mozilla::dom::NotificationDirection from "mozilla/dom/NotificationBinding.h";
62+
using mozilla::dom::UserNavigationInvolvement from "mozilla/dom/UserNavigationInvolvement.h";
6163

6264
namespace mozilla {
6365
namespace dom {
@@ -194,7 +196,10 @@ struct DocShellLoadStateInit
194196
uint32_t LoadFlags;
195197
uint32_t InternalLoadFlags;
196198

197-
// The TriggineringSandboxFlags are the SandboxFlags of the entity
199+
// https://html.spec.whatwg.org/#user-navigation-involvement
200+
UserNavigationInvolvement userNavigationInvolvement;
201+
202+
// The TriggeringSandboxFlags are the SandboxFlags of the entity
198203
// responsible for causing the load to occur.
199204
uint32_t TriggeringSandboxFlags;
200205
uint64_t TriggeringWindowId;

dom/ipc/NavigationAPIIPCUtils.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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+
#ifndef mozilla_dom_navigation_api_ipc_utils_h__
8+
#define mozilla_dom_navigation_api_ipc_utils_h__
9+
#include "ipc/EnumSerializer.h"
10+
#include "mozilla/dom/UserNavigationInvolvement.h"
11+
12+
namespace IPC {
13+
template <>
14+
struct ParamTraits<mozilla::dom::UserNavigationInvolvement>
15+
: public ContiguousEnumSerializerInclusive<
16+
mozilla::dom::UserNavigationInvolvement,
17+
mozilla::dom::UserNavigationInvolvement::None,
18+
mozilla::dom::UserNavigationInvolvement::BrowserUI> {};
19+
} // namespace IPC
20+
#endif

dom/ipc/moz.build

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ EXPORTS.mozilla.dom += [
7171
"MaybeDiscarded.h",
7272
"MemoryReportRequest.h",
7373
"NativeThreadId.h",
74+
"NavigationAPIIPCUtils.h",
7475
"PageLoadEventUtils.h",
7576
"PermissionMessageUtils.h",
7677
"ProcessActor.h",

ipc/glue/BackgroundUtils.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,8 @@ nsresult LoadInfoToLoadInfoArgs(nsILoadInfo* aLoadInfo,
602602
aLoadInfo->GetStoragePermission(), overriddenFingerprintingSettingsArg,
603603
aLoadInfo->GetIsMetaRefresh(), aLoadInfo->GetLoadingEmbedderPolicy(),
604604
aLoadInfo->GetIsOriginTrialCoepCredentiallessEnabledForTopLevel(),
605-
unstrippedURI, interceptionInfoArg, aLoadInfo->GetIsNewWindowTarget());
605+
unstrippedURI, interceptionInfoArg, aLoadInfo->GetIsNewWindowTarget(),
606+
aLoadInfo->GetUserNavigationInvolvement());
606607

607608
return NS_OK;
608609
}
@@ -897,7 +898,8 @@ nsresult LoadInfoArgsToLoadInfo(const LoadInfoArgs& loadInfoArgs,
897898
loadInfoArgs.unstrippedURI(), interceptionInfo,
898899
loadInfoArgs.hasInjectedCookieForCookieBannerHandling(),
899900
loadInfoArgs.schemelessInput(), loadInfoArgs.httpsUpgradeTelemetry(),
900-
loadInfoArgs.isNewWindowTarget());
901+
loadInfoArgs.isNewWindowTarget(),
902+
loadInfoArgs.userNavigationInvolvement());
901903

902904
if (loadInfoArgs.isFromProcessingFrameAttributes()) {
903905
loadInfo->SetIsFromProcessingFrameAttributes();
@@ -980,7 +982,8 @@ void LoadInfoToParentLoadInfoForwarder(
980982
aLoadInfo->GetRequestBlockingReason(), aLoadInfo->GetStoragePermission(),
981983
overriddenFingerprintingSettingsArg, aLoadInfo->GetIsMetaRefresh(),
982984
isThirdPartyContextToTopWindow, aLoadInfo->GetIsInThirdPartyContext(),
983-
aLoadInfo->GetIsOn3PCBExceptionList(), unstrippedURI);
985+
aLoadInfo->GetIsOn3PCBExceptionList(), unstrippedURI,
986+
aLoadInfo->GetUserNavigationInvolvement());
984987
}
985988

986989
nsresult MergeParentLoadInfoForwarder(
@@ -1108,6 +1111,9 @@ nsresult MergeParentLoadInfoForwarder(
11081111
*aForwarderArgs.containerFeaturePolicyInfo());
11091112
}
11101113

1114+
aLoadInfo->SetUserNavigationInvolvement(
1115+
uint8_t(aForwarderArgs.userNavigationInvolvement()));
1116+
11111117
return NS_OK;
11121118
}
11131119

netwerk/base/LoadInfo.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -749,7 +749,8 @@ LoadInfo::LoadInfo(
749749
bool aHasInjectedCookieForCookieBannerHandling,
750750
nsILoadInfo::SchemelessInputType aSchemelessInput,
751751
nsILoadInfo::HTTPSUpgradeTelemetryType aHttpsUpgradeTelemetry,
752-
bool aIsNewWindowTarget)
752+
bool aIsNewWindowTarget,
753+
dom::UserNavigationInvolvement aUserNavigationInvolvement)
753754
: mLoadingPrincipal(aLoadingPrincipal),
754755
mTriggeringPrincipal(aTriggeringPrincipal),
755756
mPrincipalToInherit(aPrincipalToInherit),
@@ -833,6 +834,7 @@ LoadInfo::LoadInfo(
833834
aHasInjectedCookieForCookieBannerHandling),
834835
mSchemelessInput(aSchemelessInput),
835836
mHttpsUpgradeTelemetry(aHttpsUpgradeTelemetry),
837+
mUserNavigationInvolvement(aUserNavigationInvolvement),
836838
mIsNewWindowTarget(aIsNewWindowTarget) {
837839
// Only top level TYPE_DOCUMENT loads can have a null loadingPrincipal
838840
MOZ_ASSERT(mLoadingPrincipal ||
@@ -997,6 +999,18 @@ LoadInfo::GetLoadingDocument(Document** aResult) {
997999
}
9981000
return NS_OK;
9991001
}
1002+
NS_IMETHODIMP
1003+
LoadInfo::GetUserNavigationInvolvement(uint8_t* aUserNavigationInvolvement) {
1004+
*aUserNavigationInvolvement = uint8_t(mUserNavigationInvolvement);
1005+
return NS_OK;
1006+
}
1007+
1008+
NS_IMETHODIMP
1009+
LoadInfo::SetUserNavigationInvolvement(uint8_t aUserNavigationInvolvement) {
1010+
mUserNavigationInvolvement =
1011+
dom::UserNavigationInvolvement(aUserNavigationInvolvement);
1012+
return NS_OK;
1013+
}
10001014

10011015
nsINode* LoadInfo::LoadingNode() {
10021016
nsCOMPtr<nsINode> node = do_QueryReferent(mLoadingContext);

netwerk/base/LoadInfo.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#define mozilla_LoadInfo_h
99

1010
#include "mozilla/dom/FeaturePolicy.h"
11+
#include "mozilla/dom/UserNavigationInvolvement.h"
1112
#include "nsIInterceptionInfo.h"
1213
#include "nsILoadInfo.h"
1314
#include "nsIPrincipal.h"
@@ -262,7 +263,8 @@ class LoadInfo final : public nsILoadInfo {
262263
bool aHasInjectedCookieForCookieBannerHandling,
263264
nsILoadInfo::SchemelessInputType aSchemelessInput,
264265
nsILoadInfo::HTTPSUpgradeTelemetryType aHttpsUpgradeTelemetry,
265-
bool aIsNewWindowTarget);
266+
bool aIsNewWindowTarget,
267+
dom::UserNavigationInvolvement aUserNavigationInvolvement);
266268

267269
LoadInfo(const LoadInfo& rhs);
268270

@@ -422,6 +424,9 @@ class LoadInfo final : public nsILoadInfo {
422424
nsILoadInfo::HTTPSUpgradeTelemetryType mHttpsUpgradeTelemetry =
423425
nsILoadInfo::NOT_INITIALIZED;
424426

427+
dom::UserNavigationInvolvement mUserNavigationInvolvement =
428+
dom::UserNavigationInvolvement::None;
429+
425430
bool mIsNewWindowTarget = false;
426431
bool mSkipHTTPSUpgrade = false;
427432
};

netwerk/base/TRRLoadInfo.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,17 @@ TRRLoadInfo::SetPrincipalToInherit(nsIPrincipal* aPrincipalToInherit) {
5454
return NS_ERROR_NOT_IMPLEMENTED;
5555
}
5656

57+
NS_IMETHODIMP
58+
TRRLoadInfo::GetUserNavigationInvolvement(
59+
uint8_t* aUserNavigationInvolvement) {
60+
return NS_ERROR_NOT_IMPLEMENTED;
61+
}
62+
63+
NS_IMETHODIMP
64+
TRRLoadInfo::SetUserNavigationInvolvement(uint8_t aUserNavigationInvolvement) {
65+
return NS_ERROR_NOT_IMPLEMENTED;
66+
}
67+
5768
nsIPrincipal* TRRLoadInfo::PrincipalToInherit() { return nullptr; }
5869

5970
nsIPrincipal* TRRLoadInfo::FindPrincipalToInherit(nsIChannel* aChannel) {

netwerk/base/nsILoadInfo.idl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ webidl BrowsingContext;
2222
native LoadContextRef(already_AddRefed<nsISupports>);
2323
%{C++
2424
#include "nsTArray.h"
25+
#include "mozilla/dom/UserNavigationInvolvement.h"
2526
#include "mozilla/LoadTainting.h"
2627
#include "mozilla/OriginAttributes.h"
2728
#include "mozilla/UniquePtr.h"
@@ -1617,4 +1618,18 @@ interface nsILoadInfo : nsISupports
16171618
* When true, this load will never be upgraded to HTTPS.
16181619
*/
16191620
[infallible] attribute boolean skipHTTPSUpgrade;
1621+
1622+
/**
1623+
* see https://html.spec.whatwg.org/#user-navigation-involvement
1624+
*/
1625+
attribute uint8_t userNavigationInvolvement;
1626+
%{C++
1627+
mozilla::dom::UserNavigationInvolvement GetUserNavigationInvolvement() {
1628+
uint8_t userNavigationInvolvement = 0;
1629+
mozilla::DebugOnly<nsresult> rv = GetUserNavigationInvolvement(&userNavigationInvolvement);
1630+
MOZ_ASSERT(NS_SUCCEEDED(rv));
1631+
MOZ_DIAGNOSTIC_ASSERT(userNavigationInvolvement < 3);
1632+
return static_cast<mozilla::dom::UserNavigationInvolvement>(userNavigationInvolvement);
1633+
}
1634+
%}
16201635
};

0 commit comments

Comments
 (0)