This is an automated email from the git hooks/post-receive script.
pierov pushed a commit to annotated tag FIREFOX_102_4_0esr_BUILD1 in repository tor-browser.
commit d558f4a1c67a78075a65d0d5baae2a907db22023 Author: Valentin Gosu valentin.gosu@gmail.com AuthorDate: Tue Sep 20 15:27:44 2022 +0000
Bug 1789128 - Always call LoadInfo::GetPerformanceStorage(). r=smaug, a=RyanVM --- dom/ipc/ContentChild.cpp | 22 ++++++++++++++-------- dom/ipc/ContentChild.h | 5 +++-- dom/ipc/ContentParent.cpp | 10 +++++++--- dom/ipc/ContentParent.h | 5 +++-- dom/ipc/PContent.ipdl | 3 ++- netwerk/protocol/http/HttpBaseChannel.cpp | 19 +++++++------------ netwerk/protocol/http/HttpBaseChannel.h | 1 - 7 files changed, 36 insertions(+), 29 deletions(-)
diff --git a/dom/ipc/ContentChild.cpp b/dom/ipc/ContentChild.cpp index 7efd288ba11e..518f9f1f9eeb 100644 --- a/dom/ipc/ContentChild.cpp +++ b/dom/ipc/ContentChild.cpp @@ -4230,24 +4230,30 @@ mozilla::ipc::IPCResult ContentChild::RecvScriptError( }
mozilla::ipc::IPCResult ContentChild::RecvReportFrameTimingData( - uint64_t innerWindowId, const nsString& entryName, + const mozilla::Maybe<LoadInfoArgs>& loadInfoArgs, const nsString& entryName, const nsString& initiatorType, UniquePtr<PerformanceTimingData>&& aData) { if (!aData) { return IPC_FAIL(this, "aData should not be null"); }
- auto* innerWindow = nsGlobalWindowInner::GetInnerWindowWithId(innerWindowId); - if (!innerWindow) { - return IPC_OK(); + if (loadInfoArgs.isNothing()) { + return IPC_FAIL(this, "loadInfoArgs should not be null"); }
- mozilla::dom::Performance* performance = innerWindow->GetPerformance(); - if (!performance) { + nsCOMPtr<nsILoadInfo> loadInfo; + nsresult rv = mozilla::ipc::LoadInfoArgsToLoadInfo(loadInfoArgs, + getter_AddRefs(loadInfo)); + if (NS_FAILED(rv)) { + MOZ_DIAGNOSTIC_ASSERT(false, "LoadInfoArgsToLoadInfo failed"); return IPC_OK(); }
- performance->AsPerformanceStorage()->AddEntry(entryName, initiatorType, - std::move(aData)); + // It is important to call LoadInfo::GetPerformanceStorage instead of simply + // getting the performance object via the innerWindowID in order to perform + // necessary cross origin checks. + if (PerformanceStorage* storage = loadInfo->GetPerformanceStorage()) { + storage->AddEntry(entryName, initiatorType, std::move(aData)); + } return IPC_OK(); }
diff --git a/dom/ipc/ContentChild.h b/dom/ipc/ContentChild.h index be2202ab36f1..64c44fc6a0d6 100644 --- a/dom/ipc/ContentChild.h +++ b/dom/ipc/ContentChild.h @@ -732,8 +732,9 @@ class ContentChild final : public PContentChild, const uint64_t& aInnerWindowId, const bool& aFromChromeContext);
mozilla::ipc::IPCResult RecvReportFrameTimingData( - uint64_t innerWindowId, const nsString& entryName, - const nsString& initiatorType, UniquePtr<PerformanceTimingData>&& aData); + const mozilla::Maybe<LoadInfoArgs>& loadInfoArgs, + const nsString& entryName, const nsString& initiatorType, + UniquePtr<PerformanceTimingData>&& aData);
mozilla::ipc::IPCResult RecvLoadURI( const MaybeDiscarded<BrowsingContext>& aContext, diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp index 719b03bff22a..3d742e03230b 100644 --- a/dom/ipc/ContentParent.cpp +++ b/dom/ipc/ContentParent.cpp @@ -4701,14 +4701,18 @@ mozilla::ipc::IPCResult ContentParent::RecvConsoleMessage( }
mozilla::ipc::IPCResult ContentParent::RecvReportFrameTimingData( - uint64_t aInnerWindowId, const nsString& entryName, + const mozilla::Maybe<LoadInfoArgs>& loadInfoArgs, const nsString& entryName, const nsString& initiatorType, UniquePtr<PerformanceTimingData>&& aData) { if (!aData) { return IPC_FAIL(this, "aData should not be null"); }
+ if (loadInfoArgs.isNothing()) { + return IPC_FAIL(this, "loadInfoArgs should not be null"); + } + RefPtr<WindowGlobalParent> parent = - WindowGlobalParent::GetByInnerWindowId(aInnerWindowId); + WindowGlobalParent::GetByInnerWindowId(loadInfoArgs->innerWindowID()); if (!parent || !parent->GetContentParent()) { return IPC_OK(); } @@ -4717,7 +4721,7 @@ mozilla::ipc::IPCResult ContentParent::RecvReportFrameTimingData( "No need to bounce around if in the same process");
Unused << parent->GetContentParent()->SendReportFrameTimingData( - aInnerWindowId, entryName, initiatorType, std::move(aData)); + loadInfoArgs, entryName, initiatorType, std::move(aData)); return IPC_OK(); }
diff --git a/dom/ipc/ContentParent.h b/dom/ipc/ContentParent.h index 7b029c8a77fc..2fba4778fc61 100644 --- a/dom/ipc/ContentParent.h +++ b/dom/ipc/ContentParent.h @@ -1066,8 +1066,9 @@ class ContentParent final : public PContentParent, const uint64_t& aInnerWindowId, const bool& aIsFromChromeContext);
mozilla::ipc::IPCResult RecvReportFrameTimingData( - uint64_t innerWindowId, const nsString& entryName, - const nsString& initiatorType, UniquePtr<PerformanceTimingData>&& aData); + const mozilla::Maybe<LoadInfoArgs>& loadInfoArgs, + const nsString& entryName, const nsString& initiatorType, + UniquePtr<PerformanceTimingData>&& aData);
mozilla::ipc::IPCResult RecvScriptErrorWithStack( const nsString& aMessage, const nsString& aSourceName, diff --git a/dom/ipc/PContent.ipdl b/dom/ipc/PContent.ipdl index 490d60d68437..d3957247d452 100644 --- a/dom/ipc/PContent.ipdl +++ b/dom/ipc/PContent.ipdl @@ -1794,9 +1794,10 @@ both: * another process. Child frame will send data to its ContentParent which * will then identify the ContentParent for the innerWindowId and pass * the data to the correct process. + * loadInfo is passed in order to enforce same-origin security checks * aData must be non-null. */ - async ReportFrameTimingData(uint64_t innerWindowId, nsString entryName, + async ReportFrameTimingData(LoadInfoArgs? loadInfo, nsString entryName, nsString initiatorType, UniquePtr<PerformanceTimingData> aData);
diff --git a/netwerk/protocol/http/HttpBaseChannel.cpp b/netwerk/protocol/http/HttpBaseChannel.cpp index c7bc0342073c..30a4d208f2a2 100644 --- a/netwerk/protocol/http/HttpBaseChannel.cpp +++ b/netwerk/protocol/http/HttpBaseChannel.cpp @@ -5233,29 +5233,22 @@ IMPL_TIMING_ATTR(RedirectEnd)
#undef IMPL_TIMING_ATTR
-mozilla::dom::PerformanceStorage* HttpBaseChannel::GetPerformanceStorage() { +void HttpBaseChannel::MaybeReportTimingData() { // If performance timing is disabled, there is no need for the Performance // object anymore. if (!LoadTimingEnabled()) { - return nullptr; + return; }
// There is no point in continuing, since the performance object in the parent // isn't the same as the one in the child which will be reporting resource // performance. - if (XRE_IsE10sParentProcess()) { - return nullptr; - } - return mLoadInfo->GetPerformanceStorage(); -} - -void HttpBaseChannel::MaybeReportTimingData() { if (XRE_IsE10sParentProcess()) { return; }
mozilla::dom::PerformanceStorage* documentPerformance = - GetPerformanceStorage(); + mLoadInfo->GetPerformanceStorage(); if (documentPerformance) { documentPerformance->AddEntry(this, this); return; @@ -5278,8 +5271,10 @@ void HttpBaseChannel::MaybeReportTimingData() { if (!performanceTimingData) { return; } - child->SendReportFrameTimingData(mLoadInfo->GetInnerWindowID(), entryName, - initiatorType, + + Maybe<LoadInfoArgs> loadInfoArgs; + mozilla::ipc::LoadInfoToLoadInfoArgs(mLoadInfo, &loadInfoArgs); + child->SendReportFrameTimingData(loadInfoArgs, entryName, initiatorType, std::move(performanceTimingData)); } } diff --git a/netwerk/protocol/http/HttpBaseChannel.h b/netwerk/protocol/http/HttpBaseChannel.h index a273fa09e250..ca38a8d0a4dd 100644 --- a/netwerk/protocol/http/HttpBaseChannel.h +++ b/netwerk/protocol/http/HttpBaseChannel.h @@ -551,7 +551,6 @@ class HttpBaseChannel : public nsHashPropertyBag, // was fired. void NotifySetCookie(const nsACString& aCookie);
- mozilla::dom::PerformanceStorage* GetPerformanceStorage(); void MaybeReportTimingData(); nsIURI* GetReferringPage(); nsPIDOMWindowInner* GetInnerDOMWindow();