Bug 1487964 - Do not report resource-timing subdocument loads triggered by that subdocument r=bzbarsky

Differential Revision: https://phabricator.services.mozilla.com/D9503

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Valentin Gosu 2018-11-17 19:30:36 +00:00
parent c543b5295f
commit a80d7bf63e
13 changed files with 79 additions and 23 deletions

View file

@ -764,6 +764,7 @@ nsDocShell::LoadURI(nsDocShellLoadState* aLoadState)
resultPrincipalURI, resultPrincipalURI,
aLoadState->KeepResultPrincipalURIIfSet(), aLoadState->KeepResultPrincipalURIIfSet(),
aLoadState->LoadReplace(), aLoadState->LoadReplace(),
aLoadState->GetIsFromProcessingFrameAttributes(),
aLoadState->Referrer(), aLoadState->Referrer(),
aLoadState->ReferrerPolicy(), aLoadState->ReferrerPolicy(),
aLoadState->TriggeringPrincipal(), aLoadState->TriggeringPrincipal(),
@ -4814,7 +4815,8 @@ nsDocShell::LoadErrorPage(nsIURI* aErrorURI, nsIURI* aFailedURI, nsIChannel* aFa
mLSHE->AbandonBFCacheEntry(); mLSHE->AbandonBFCacheEntry();
} }
return InternalLoad(aErrorURI, nullptr, Nothing(), false, false, nullptr, RP_Unset, return InternalLoad(aErrorURI, nullptr, Nothing(), false, false,
false, nullptr, RP_Unset,
nsContentUtils::GetSystemPrincipal(), nullptr, nsContentUtils::GetSystemPrincipal(), nullptr,
INTERNAL_LOAD_FLAGS_NONE, EmptyString(), INTERNAL_LOAD_FLAGS_NONE, EmptyString(),
VoidCString(), VoidString(), nullptr, nullptr, VoidCString(), VoidString(), nullptr, nullptr,
@ -4914,6 +4916,7 @@ nsDocShell::Reload(uint32_t aReloadFlags)
emplacedResultPrincipalURI, emplacedResultPrincipalURI,
false, false,
loadReplace, loadReplace,
false, // IsFromProcessingFrameAttributes
referrerURI, referrerURI,
referrerPolicy, referrerPolicy,
triggeringPrincipal, triggeringPrincipal,
@ -9002,6 +9005,7 @@ public:
Maybe<nsCOMPtr<nsIURI>> const& aResultPrincipalURI, Maybe<nsCOMPtr<nsIURI>> const& aResultPrincipalURI,
bool aKeepResultPrincipalURIIfSet, bool aKeepResultPrincipalURIIfSet,
bool aLoadReplace, bool aLoadReplace,
bool aIsFromProcessingFrameAttributes,
nsIURI* aReferrer, uint32_t aReferrerPolicy, nsIURI* aReferrer, uint32_t aReferrerPolicy,
nsIPrincipal* aTriggeringPrincipal, nsIPrincipal* aTriggeringPrincipal,
nsIPrincipal* aPrincipalToInherit, nsIPrincipal* aPrincipalToInherit,
@ -9024,6 +9028,7 @@ public:
, mResultPrincipalURI(aResultPrincipalURI) , mResultPrincipalURI(aResultPrincipalURI)
, mKeepResultPrincipalURIIfSet(aKeepResultPrincipalURIIfSet) , mKeepResultPrincipalURIIfSet(aKeepResultPrincipalURIIfSet)
, mLoadReplace(aLoadReplace) , mLoadReplace(aLoadReplace)
, mIsFromProcessingFrameAttributes(aIsFromProcessingFrameAttributes)
, mReferrer(aReferrer) , mReferrer(aReferrer)
, mReferrerPolicy(aReferrerPolicy) , mReferrerPolicy(aReferrerPolicy)
, mTriggeringPrincipal(aTriggeringPrincipal) , mTriggeringPrincipal(aTriggeringPrincipal)
@ -9048,6 +9053,7 @@ public:
return mDocShell->InternalLoad(mURI, mOriginalURI, mResultPrincipalURI, return mDocShell->InternalLoad(mURI, mOriginalURI, mResultPrincipalURI,
mKeepResultPrincipalURIIfSet, mKeepResultPrincipalURIIfSet,
mLoadReplace, mLoadReplace,
mIsFromProcessingFrameAttributes,
mReferrer, mReferrer,
mReferrerPolicy, mReferrerPolicy,
mTriggeringPrincipal, mPrincipalToInherit, mTriggeringPrincipal, mPrincipalToInherit,
@ -9070,6 +9076,7 @@ private:
Maybe<nsCOMPtr<nsIURI>> mResultPrincipalURI; Maybe<nsCOMPtr<nsIURI>> mResultPrincipalURI;
bool mKeepResultPrincipalURIIfSet; bool mKeepResultPrincipalURIIfSet;
bool mLoadReplace; bool mLoadReplace;
bool mIsFromProcessingFrameAttributes;
nsCOMPtr<nsIURI> mReferrer; nsCOMPtr<nsIURI> mReferrer;
uint32_t mReferrerPolicy; uint32_t mReferrerPolicy;
nsCOMPtr<nsIPrincipal> mTriggeringPrincipal; nsCOMPtr<nsIPrincipal> mTriggeringPrincipal;
@ -9106,6 +9113,7 @@ nsDocShell::InternalLoad(nsIURI* aURI,
Maybe<nsCOMPtr<nsIURI>> const& aResultPrincipalURI, Maybe<nsCOMPtr<nsIURI>> const& aResultPrincipalURI,
bool aKeepResultPrincipalURIIfSet, bool aKeepResultPrincipalURIIfSet,
bool aLoadReplace, bool aLoadReplace,
bool aIsFromProcessingFrameAttributes,
nsIURI* aReferrer, nsIURI* aReferrer,
uint32_t aReferrerPolicy, uint32_t aReferrerPolicy,
nsIPrincipal* aTriggeringPrincipal, nsIPrincipal* aTriggeringPrincipal,
@ -9458,6 +9466,7 @@ nsDocShell::InternalLoad(nsIURI* aURI,
aResultPrincipalURI, aResultPrincipalURI,
aKeepResultPrincipalURIIfSet, aKeepResultPrincipalURIIfSet,
aLoadReplace, aLoadReplace,
aIsFromProcessingFrameAttributes,
aReferrer, aReferrer,
aReferrerPolicy, aReferrerPolicy,
aTriggeringPrincipal, aTriggeringPrincipal,
@ -9556,7 +9565,8 @@ nsDocShell::InternalLoad(nsIURI* aURI,
nsCOMPtr<nsIRunnable> ev = nsCOMPtr<nsIRunnable> ev =
new InternalLoadEvent(this, aURI, aOriginalURI, aResultPrincipalURI, new InternalLoadEvent(this, aURI, aOriginalURI, aResultPrincipalURI,
aKeepResultPrincipalURIIfSet, aKeepResultPrincipalURIIfSet,
aLoadReplace, aReferrer, aReferrerPolicy, aLoadReplace, aIsFromProcessingFrameAttributes,
aReferrer, aReferrerPolicy,
aTriggeringPrincipal, principalToInherit, aTriggeringPrincipal, principalToInherit,
aFlags, aTypeHint, aPostData, aFlags, aTypeHint, aPostData,
aHeadersData, aLoadType, aSHEntry, aFirstParty, aHeadersData, aLoadType, aSHEntry, aFirstParty,
@ -10070,6 +10080,7 @@ nsDocShell::InternalLoad(nsIURI* aURI,
nsCOMPtr<nsIRequest> req; nsCOMPtr<nsIRequest> req;
rv = DoURILoad(aURI, aOriginalURI, aResultPrincipalURI, rv = DoURILoad(aURI, aOriginalURI, aResultPrincipalURI,
aKeepResultPrincipalURIIfSet, aLoadReplace, aKeepResultPrincipalURIIfSet, aLoadReplace,
aIsFromProcessingFrameAttributes,
loadFromExternal, loadFromExternal,
(aFlags & INTERNAL_LOAD_FLAGS_FORCE_ALLOW_DATA_URI), (aFlags & INTERNAL_LOAD_FLAGS_FORCE_ALLOW_DATA_URI),
(aFlags & INTERNAL_LOAD_FLAGS_ORIGINAL_FRAME_SRC), (aFlags & INTERNAL_LOAD_FLAGS_ORIGINAL_FRAME_SRC),
@ -10218,6 +10229,7 @@ nsDocShell::DoURILoad(nsIURI* aURI,
Maybe<nsCOMPtr<nsIURI>> const& aResultPrincipalURI, Maybe<nsCOMPtr<nsIURI>> const& aResultPrincipalURI,
bool aKeepResultPrincipalURIIfSet, bool aKeepResultPrincipalURIIfSet,
bool aLoadReplace, bool aLoadReplace,
bool aIsFromProcessingFrameAttributes,
bool aLoadFromExternal, bool aLoadFromExternal,
bool aForceAllowDataURI, bool aForceAllowDataURI,
bool aOriginalFrameSrc, bool aOriginalFrameSrc,
@ -10393,7 +10405,7 @@ nsDocShell::DoURILoad(nsIURI* aURI,
securityFlags |= nsILoadInfo::SEC_SANDBOXED; securityFlags |= nsILoadInfo::SEC_SANDBOXED;
} }
nsCOMPtr<nsILoadInfo> loadInfo = RefPtr<LoadInfo> loadInfo =
(aContentPolicyType == nsIContentPolicy::TYPE_DOCUMENT) ? (aContentPolicyType == nsIContentPolicy::TYPE_DOCUMENT) ?
new LoadInfo(loadingWindow, aTriggeringPrincipal, topLevelLoadingContext, new LoadInfo(loadingWindow, aTriggeringPrincipal, topLevelLoadingContext,
securityFlags) : securityFlags) :
@ -10439,6 +10451,10 @@ nsDocShell::DoURILoad(nsIURI* aURI,
rv = loadInfo->SetIsDocshellReload(mLoadType & LOAD_CMD_RELOAD); rv = loadInfo->SetIsDocshellReload(mLoadType & LOAD_CMD_RELOAD);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
if (aIsFromProcessingFrameAttributes) {
loadInfo->SetIsFromProcessingFrameAttributes();
}
if (!isSrcdoc) { if (!isSrcdoc) {
rv = NS_NewChannelInternal(getter_AddRefs(channel), rv = NS_NewChannelInternal(getter_AddRefs(channel),
aURI, aURI,
@ -12149,6 +12165,7 @@ nsDocShell::LoadHistoryEntry(nsISHEntry* aEntry, uint32_t aLoadType)
emplacedResultPrincipalURI, emplacedResultPrincipalURI,
false, false,
loadReplace, loadReplace,
false, // IsFromProcessingFrameAttributes
referrerURI, referrerURI,
referrerPolicy, referrerPolicy,
triggeringPrincipal, triggeringPrincipal,
@ -13341,6 +13358,7 @@ nsDocShell::OnLinkClickSync(nsIContent* aContent,
Nothing(), // Let the protocol handler assign it Nothing(), // Let the protocol handler assign it
false, false,
false, // LoadReplace false, // LoadReplace
false, // IsFromProcessingFrameAttributes
referer, // Referer URI referer, // Referer URI
refererPolicy, // Referer policy refererPolicy, // Referer policy
triggeringPrincipal, triggeringPrincipal,

View file

@ -532,6 +532,7 @@ private: // member functions
mozilla::Maybe<nsCOMPtr<nsIURI>> const& aResultPrincipalURI, mozilla::Maybe<nsCOMPtr<nsIURI>> const& aResultPrincipalURI,
bool aKeepResultPrincipalURIIfSet, bool aKeepResultPrincipalURIIfSet,
bool aLoadReplace, bool aLoadReplace,
bool aIsFromProcessingFrameAttributes,
bool aLoadFromExternal, bool aLoadFromExternal,
bool aForceAllowDataURI, bool aForceAllowDataURI,
bool aOriginalFrameSrc, bool aOriginalFrameSrc,

View file

@ -30,6 +30,7 @@ nsDocShellLoadState::nsDocShellLoadState()
, mTypeHint(VoidCString()) , mTypeHint(VoidCString())
, mFileName(VoidString()) , mFileName(VoidString())
, mDocShellInternalLoadFlags(0) , mDocShellInternalLoadFlags(0)
, mIsFromProcessingFrameAttributes(false)
{ {
} }

View file

@ -165,6 +165,9 @@ public:
// information and origin attributes. // information and origin attributes.
nsresult SetupTriggeringPrincipal(const mozilla::OriginAttributes& aOriginAttributes); nsresult SetupTriggeringPrincipal(const mozilla::OriginAttributes& aOriginAttributes);
void SetIsFromProcessingFrameAttributes() { mIsFromProcessingFrameAttributes = true; }
bool GetIsFromProcessingFrameAttributes() { return mIsFromProcessingFrameAttributes; }
// When loading a document through nsDocShell::LoadURI(), a special set of // When loading a document through nsDocShell::LoadURI(), a special set of
// flags needs to be set based on other values in nsDocShellLoadState. This // flags needs to be set based on other values in nsDocShellLoadState. This
// function calculates those flags, before the LoadState is passed to // function calculates those flags, before the LoadState is passed to
@ -288,6 +291,10 @@ protected:
// nsDocShell::InternalLoad, taken from the INTERNAL_LOAD consts in // nsDocShell::InternalLoad, taken from the INTERNAL_LOAD consts in
// nsIDocShell.idl // nsIDocShell.idl
uint32_t mDocShellInternalLoadFlags; uint32_t mDocShellInternalLoadFlags;
// This will be true if this load is triggered by attribute changes.
// See nsILoadInfo.isFromProcessingFrameAttributes
bool mIsFromProcessingFrameAttributes;
}; };
#endif /* nsDocShellLoadState_h__ */ #endif /* nsDocShellLoadState_h__ */

View file

@ -137,6 +137,9 @@ interface nsIDocShell : nsIDocShellTreeItem
* @param aLoadReplace - If set LOAD_REPLACE flag will be set on the * @param aLoadReplace - If set LOAD_REPLACE flag will be set on the
* channel. aOriginalURI is null, this argument is * channel. aOriginalURI is null, this argument is
* ignored. * ignored.
* @param aIsFromProcessingFrameAttributes
* - If this is a load triggered by changing frame attributes.
* See nsILoadInfo.isFromProcessingFrameAttributes
* @param aReferrer - Referring URI * @param aReferrer - Referring URI
* @param aReferrerPolicy - Referrer policy * @param aReferrerPolicy - Referrer policy
* @param aTriggeringPrincipal - A non-null principal that initiated that load. * @param aTriggeringPrincipal - A non-null principal that initiated that load.
@ -184,6 +187,7 @@ interface nsIDocShell : nsIDocShellTreeItem
[const] in MaybeURI aResultPrincipalURI, [const] in MaybeURI aResultPrincipalURI,
in bool aKeepResultPrincipalURIIfSet, in bool aKeepResultPrincipalURIIfSet,
in boolean aLoadReplace, in boolean aLoadReplace,
in boolean aIsFromProcessingFrameAttributes,
in nsIURI aReferrer, in nsIURI aReferrer,
in unsigned long aReferrerPolicy, in unsigned long aReferrerPolicy,
in nsIPrincipal aTriggeringPrincipal, in nsIPrincipal aTriggeringPrincipal,

View file

@ -464,6 +464,8 @@ nsFrameLoader::ReallyStartLoadingInternal()
nsIWebNavigation::LOAD_FLAGS_DISALLOW_INHERIT_PRINCIPAL; nsIWebNavigation::LOAD_FLAGS_DISALLOW_INHERIT_PRINCIPAL;
} }
loadState->SetIsFromProcessingFrameAttributes();
// Kick off the load... // Kick off the load...
bool tmpState = mNeedsAsyncDestroy; bool tmpState = mNeedsAsyncDestroy;
mNeedsAsyncDestroy = true; mNeedsAsyncDestroy = true;

View file

@ -453,7 +453,8 @@ LoadInfoToLoadInfoArgs(nsILoadInfo *aLoadInfo,
aLoadInfo->GetLoadTriggeredFromExternal(), aLoadInfo->GetLoadTriggeredFromExternal(),
aLoadInfo->GetServiceWorkerTaintingSynthesized(), aLoadInfo->GetServiceWorkerTaintingSynthesized(),
aLoadInfo->GetDocumentHasUserInteracted(), aLoadInfo->GetDocumentHasUserInteracted(),
aLoadInfo->GetDocumentHasLoaded() aLoadInfo->GetDocumentHasLoaded(),
aLoadInfo->GetIsFromProcessingFrameAttributes()
); );
return NS_OK; return NS_OK;
@ -571,7 +572,7 @@ LoadInfoArgsToLoadInfo(const OptionalLoadInfoArgs& aOptionalLoadInfoArgs,
loadInfoArgs.controller().get_IPCServiceWorkerDescriptor())); loadInfoArgs.controller().get_IPCServiceWorkerDescriptor()));
} }
nsCOMPtr<nsILoadInfo> loadInfo = RefPtr<mozilla::LoadInfo> loadInfo =
new mozilla::LoadInfo(loadingPrincipal, new mozilla::LoadInfo(loadingPrincipal,
triggeringPrincipal, triggeringPrincipal,
principalToInherit, principalToInherit,
@ -619,6 +620,10 @@ LoadInfoArgsToLoadInfo(const OptionalLoadInfoArgs& aOptionalLoadInfoArgs,
loadInfoArgs.documentHasLoaded() loadInfoArgs.documentHasLoaded()
); );
if (loadInfoArgs.isFromProcessingFrameAttributes()) {
loadInfo->SetIsFromProcessingFrameAttributes();
}
loadInfo.forget(outLoadInfo); loadInfo.forget(outLoadInfo);
return NS_OK; return NS_OK;
} }

View file

@ -94,6 +94,7 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
, mIsTrackerBlocked(false) , mIsTrackerBlocked(false)
, mDocumentHasUserInteracted(false) , mDocumentHasUserInteracted(false)
, mDocumentHasLoaded(false) , mDocumentHasLoaded(false)
, mIsFromProcessingFrameAttributes(false)
{ {
MOZ_ASSERT(mLoadingPrincipal); MOZ_ASSERT(mLoadingPrincipal);
MOZ_ASSERT(mTriggeringPrincipal); MOZ_ASSERT(mTriggeringPrincipal);
@ -366,6 +367,7 @@ LoadInfo::LoadInfo(nsPIDOMWindowOuter* aOuterWindow,
, mIsTrackerBlocked(false) , mIsTrackerBlocked(false)
, mDocumentHasUserInteracted(false) , mDocumentHasUserInteracted(false)
, mDocumentHasLoaded(false) , mDocumentHasLoaded(false)
, mIsFromProcessingFrameAttributes(false)
{ {
// Top-level loads are never third-party // Top-level loads are never third-party
// Grab the information we can out of the window. // Grab the information we can out of the window.
@ -468,6 +470,7 @@ LoadInfo::LoadInfo(const LoadInfo& rhs)
, mIsTrackerBlocked(rhs.mIsTrackerBlocked) , mIsTrackerBlocked(rhs.mIsTrackerBlocked)
, mDocumentHasUserInteracted(rhs.mDocumentHasUserInteracted) , mDocumentHasUserInteracted(rhs.mDocumentHasUserInteracted)
, mDocumentHasLoaded(rhs.mDocumentHasLoaded) , mDocumentHasLoaded(rhs.mDocumentHasLoaded)
, mIsFromProcessingFrameAttributes(rhs.mIsFromProcessingFrameAttributes)
{ {
} }
@ -562,6 +565,7 @@ LoadInfo::LoadInfo(nsIPrincipal* aLoadingPrincipal,
, mIsTrackerBlocked(false) , mIsTrackerBlocked(false)
, mDocumentHasUserInteracted(aDocumentHasUserInteracted) , mDocumentHasUserInteracted(aDocumentHasUserInteracted)
, mDocumentHasLoaded(aDocumentHasLoaded) , mDocumentHasLoaded(aDocumentHasLoaded)
, mIsFromProcessingFrameAttributes(false)
{ {
// Only top level TYPE_DOCUMENT loads can have a null loadingPrincipal // Only top level TYPE_DOCUMENT loads can have a null loadingPrincipal
MOZ_ASSERT(mLoadingPrincipal || aContentPolicyType == nsIContentPolicy::TYPE_DOCUMENT); MOZ_ASSERT(mLoadingPrincipal || aContentPolicyType == nsIContentPolicy::TYPE_DOCUMENT);
@ -1450,6 +1454,20 @@ LoadInfo::GetIsTopLevelLoad(bool *aResult)
return NS_OK; return NS_OK;
} }
void
LoadInfo::SetIsFromProcessingFrameAttributes()
{
mIsFromProcessingFrameAttributes = true;
}
NS_IMETHODIMP
LoadInfo::GetIsFromProcessingFrameAttributes(bool *aIsFromProcessingFrameAttributes)
{
MOZ_ASSERT(aIsFromProcessingFrameAttributes);
*aIsFromProcessingFrameAttributes = mIsFromProcessingFrameAttributes;
return NS_OK;
}
NS_IMETHODIMP NS_IMETHODIMP
LoadInfo::GetResultPrincipalURI(nsIURI **aURI) LoadInfo::GetResultPrincipalURI(nsIURI **aURI)
{ {

View file

@ -87,6 +87,7 @@ public:
void SetUpgradeInsecureRequests(); void SetUpgradeInsecureRequests();
void SetBrowserUpgradeInsecureRequests(); void SetBrowserUpgradeInsecureRequests();
void SetBrowserWouldUpgradeInsecureRequests(); void SetBrowserWouldUpgradeInsecureRequests();
void SetIsFromProcessingFrameAttributes();
private: private:
// private constructor that is only allowed to be called from within // private constructor that is only allowed to be called from within
@ -219,6 +220,11 @@ private:
bool mIsTrackerBlocked; bool mIsTrackerBlocked;
bool mDocumentHasUserInteracted; bool mDocumentHasUserInteracted;
bool mDocumentHasLoaded; bool mDocumentHasLoaded;
// Is true if this load was triggered by processing the attributes of the
// browsing context container.
// See nsILoadInfo.isFromProcessingFrameAttributes
bool mIsFromProcessingFrameAttributes;
}; };
} // namespace net } // namespace net

View file

@ -1068,4 +1068,11 @@ interface nsILoadInfo : nsISupports
* See bug 1500908. * See bug 1500908.
*/ */
attribute nsICSPEventListener cspEventListener; attribute nsICSPEventListener cspEventListener;
/**
* This attribute will be true if this is a load triggered by
* https://html.spec.whatwg.org/multipage/iframe-embed-object.html#process-the-iframe-attributes
* or https://html.spec.whatwg.org/multipage/obsolete.html#process-the-frame-attributes
*/
[infallible] readonly attribute boolean isFromProcessingFrameAttributes;
}; };

View file

@ -110,6 +110,7 @@ struct LoadInfoArgs
bool serviceWorkerTaintingSynthesized; bool serviceWorkerTaintingSynthesized;
bool documentHasUserInteracted; bool documentHasUserInteracted;
bool documentHasLoaded; bool documentHasLoaded;
bool isFromProcessingFrameAttributes;
}; };
/** /**

View file

@ -4413,11 +4413,10 @@ HttpBaseChannel::GetPerformanceStorage()
return nullptr; return nullptr;
} }
// We only add to the document's performance object if it has the same if (mLoadInfo->GetExternalContentPolicyType() == nsIContentPolicy::TYPE_SUBDOCUMENT &&
// principal as the one triggering the load. This is to prevent navigations !mLoadInfo->GetIsFromProcessingFrameAttributes()) {
// triggered _by_ the iframe from showing up in the parent document's // We only report loads caused by processing the attributes of the
// performance entries if they have different origins. // browsing context container.
if (!mLoadInfo->TriggeringPrincipal()->Equals(loadingDocument->NodePrincipal())) {
return nullptr; return nullptr;
} }

View file

@ -1,13 +0,0 @@
[resource_subframe_self_navigation.html]
[Subsequent <iframe> navigations don't appear in the resource-timing buffer.]
expected: FAIL
[Subsequent <frame> navigations don't appear in the resource-timing buffer.]
expected: FAIL
[Subsequent <embed> navigations don't appear in the resource-timing buffer.]
expected: FAIL
[Subsequent <object> navigations don't appear in the resource-timing buffer.]
expected: FAIL