Browse Source

Issue #unknown, Reload Flooding prevention.

gre-tracking
roytam1 8 months ago
parent
commit
26ae6482f6
  1. 41
      docshell/base/nsDocShell.cpp
  2. 12
      docshell/base/nsDocShell.h
  3. 2
      dom/locales/en-US/chrome/dom/dom.properties

41
docshell/base/nsDocShell.cpp

@ -822,6 +822,8 @@ nsDocShell::nsDocShell()
, mTouchEventsOverride(nsIDocShell::TOUCHEVENTS_OVERRIDE_NONE)
, mStateFloodGuardCount(0)
, mStateFloodGuardReported(false)
, mReloadFloodGuardCount(0)
, mReloadFloodGuardReported(false)
{
AssertOriginAttributesMatchPrivateBrowsing();
mHistoryID = ++gDocshellIDCounter;
@ -5329,6 +5331,25 @@ nsDocShell::LoadErrorPage(nsIURI* aURI, const char16_t* aURL,
nullptr);
}
bool
nsDocShell::IsReloadFlooding()
{
if (mReloadFloodGuardCount > kReloadLimit) {
TimeStamp now = TimeStamp::Now();
if (now - mReloadFloodGuardUpdated > TimeDuration::FromSeconds(kReloadTimeSecs)) {
mReloadFloodGuardCount = 0;
mReloadFloodGuardUpdated = now;
mReloadFloodGuardReported = false;
return false;
}
return true;
}
mReloadFloodGuardCount++;
return false;
}
NS_IMETHODIMP
nsDocShell::Reload(uint32_t aReloadFlags)
{
@ -5354,6 +5375,26 @@ nsDocShell::Reload(uint32_t aReloadFlags)
shistInt->NotifyOnHistoryReload(mCurrentURI, aReloadFlags, &canReload);
}
// If we're being flooded with reload requests, we should abort early
// from the reload logic.
if (IsReloadFlooding()) {
// Report a warning to the console to tell developers why their reload
// failed.
// Do this only if not yet marked reported so we only report it once per
// flood interval.
if (!mReloadFloodGuardReported) {
#if 0
nsContentUtils::ReportToConsole(nsIScriptError::warningFlag,
NS_LITERAL_CSTRING("Reload"),
GetDocument(),
nsContentUtils::eDOM_PROPERTIES,
"ReloadFloodingPrevented");
#endif
mReloadFloodGuardReported = true;
}
return NS_OK;
}
if (!canReload) {
return NS_OK;
}

12
docshell/base/nsDocShell.h

@ -1058,6 +1058,15 @@ private:
const int32_t kStateUpdateLimit = 50;
const double kRefreshTimeSecs = 10.0;
// Keep track how how many history state changes we're getting, to catch &
// prevent flooding.
int32_t mReloadFloodGuardCount;
mozilla::TimeStamp mReloadFloodGuardUpdated;
bool mReloadFloodGuardReported;
// We have a limit of reloading 50 times every 10 seconds.
const int32_t kReloadLimit = 50;
const double kReloadTimeSecs = 10.0;
// Separate function to do the actual name (i.e. not _top, _self etc.)
// searching for FindItemWithName.
nsresult DoFindItemWithName(const nsAString& aName,
@ -1077,6 +1086,9 @@ private:
// ReplaceState.
bool IsStateChangeFlooding();
// Helper method for Reload which checks for excessive calls to Reload.
bool IsReloadFlooding();
#ifdef DEBUG
// We're counting the number of |nsDocShells| to help find leaks
static unsigned long gNumberOfDocShells;

2
dom/locales/en-US/chrome/dom/dom.properties

@ -318,3 +318,5 @@ LargeAllocationInIFrame=A Large-Allocation header was ignored due to the load oc
LargeAllocationNonE10S=A Large-Allocation header was ignored due to the document not being loaded out of process.
# LOCALIZATION NOTE: Do not translate "pushState" and "replaceState"
PushStateFloodingPrevented=Call to pushState or replaceState ignored due to excessive calls within a short timeframe.
# LOCALIZATION NOTE: Do not translate "Reload"
ReloadFloodingPrevented=Call to Reload ignored due to excessive calls within a short timeframe.

Loading…
Cancel
Save