diff options
Diffstat (limited to 'docshell/base')
-rw-r--r-- | docshell/base/BaseHistory.cpp | 9 | ||||
-rw-r--r-- | docshell/base/BrowsingContext.cpp | 45 | ||||
-rw-r--r-- | docshell/base/CanonicalBrowsingContext.cpp | 10 | ||||
-rw-r--r-- | docshell/base/nsDocShell.cpp | 31 | ||||
-rw-r--r-- | docshell/base/nsDocShell.h | 3 | ||||
-rw-r--r-- | docshell/base/nsDocShellTreeOwner.cpp | 9 |
6 files changed, 62 insertions, 45 deletions
diff --git a/docshell/base/BaseHistory.cpp b/docshell/base/BaseHistory.cpp index 3932711b5b..84e257a54c 100644 --- a/docshell/base/BaseHistory.cpp +++ b/docshell/base/BaseHistory.cpp @@ -94,8 +94,15 @@ void BaseHistory::RegisterVisitedCallback(nsIURI* aURI, Link* aLink) { mTrackedURIs.WithEntryHandle(aURI, [&](auto&& entry) -> ObservingLinks* { MOZ_DIAGNOSTIC_ASSERT(!entry || !entry->mLinks.IsEmpty(), "An empty key was kept around in our hashtable!"); + if (!entry) { - ScheduleVisitedQuery(aURI, nullptr); + // If the URI has userpass, skip the visit query scheduling, because + // these URIs are not stored by history, and their status is only + // updated at the time of a visit. + bool hasUserPass; + if (NS_FAILED(aURI->GetHasUserPass(&hasUserPass)) || !hasUserPass) { + ScheduleVisitedQuery(aURI, nullptr); + } } return &entry.OrInsertWith([] { return ObservingLinks{}; }); diff --git a/docshell/base/BrowsingContext.cpp b/docshell/base/BrowsingContext.cpp index 141036a86c..6e1a1b6893 100644 --- a/docshell/base/BrowsingContext.cpp +++ b/docshell/base/BrowsingContext.cpp @@ -20,6 +20,7 @@ #endif #include "mozilla/AppShutdown.h" #include "mozilla/dom/CanonicalBrowsingContext.h" +#include "mozilla/dom/BindingIPCUtils.h" #include "mozilla/dom/BrowserHost.h" #include "mozilla/dom/BrowserChild.h" #include "mozilla/dom/BrowserParent.h" @@ -96,23 +97,17 @@ namespace IPC { // Allow serialization and deserialization of OrientationType over IPC template <> struct ParamTraits<mozilla::dom::OrientationType> - : public ContiguousEnumSerializer< - mozilla::dom::OrientationType, - mozilla::dom::OrientationType::Portrait_primary, - mozilla::dom::OrientationType::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer<mozilla::dom::OrientationType> { +}; template <> struct ParamTraits<mozilla::dom::DisplayMode> - : public ContiguousEnumSerializer<mozilla::dom::DisplayMode, - mozilla::dom::DisplayMode::Browser, - mozilla::dom::DisplayMode::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer<mozilla::dom::DisplayMode> {}; template <> struct ParamTraits<mozilla::dom::PrefersColorSchemeOverride> - : public ContiguousEnumSerializer< - mozilla::dom::PrefersColorSchemeOverride, - mozilla::dom::PrefersColorSchemeOverride::None, - mozilla::dom::PrefersColorSchemeOverride::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::PrefersColorSchemeOverride> {}; template <> struct ParamTraits<mozilla::dom::ExplicitActiveStatus> @@ -124,10 +119,8 @@ struct ParamTraits<mozilla::dom::ExplicitActiveStatus> // Allow serialization and deserialization of TouchEventsOverride over IPC template <> struct ParamTraits<mozilla::dom::TouchEventsOverride> - : public ContiguousEnumSerializer< - mozilla::dom::TouchEventsOverride, - mozilla::dom::TouchEventsOverride::Disabled, - mozilla::dom::TouchEventsOverride::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::TouchEventsOverride> {}; template <> struct ParamTraits<mozilla::dom::EmbedderColorSchemes> { @@ -168,6 +161,9 @@ static StaticAutoPtr<BrowsingContextMap> sBrowsingContexts; // Top-level Content BrowsingContexts only, indexed by BrowserId instead of Id static StaticAutoPtr<BrowsingContextMap> sCurrentTopByBrowserId; +static bool gIPCEnabledAnnotation = false; +static bool gFissionEnabledAnnotation = false; + static void UnregisterBrowserId(BrowsingContext* aBrowsingContext) { if (!aBrowsingContext->IsTopContent() || !sCurrentTopByBrowserId) { return; @@ -255,6 +251,11 @@ void BrowsingContext::Init() { sCurrentTopByBrowserId = new BrowsingContextMap(); ClearOnShutdown(&sBrowsingContexts); ClearOnShutdown(&sCurrentTopByBrowserId); + CrashReporter::RegisterAnnotationBool( + CrashReporter::Annotation::DOMIPCEnabled, &gIPCEnabledAnnotation); + CrashReporter::RegisterAnnotationBool( + CrashReporter::Annotation::DOMFissionEnabled, + &gFissionEnabledAnnotation); } } @@ -1665,11 +1666,8 @@ NS_IMETHODIMP BrowsingContext::SetRemoteTabs(bool aUseRemoteTabs) { return NS_ERROR_FAILURE; } - static bool annotated = false; - if (aUseRemoteTabs && !annotated) { - annotated = true; - CrashReporter::AnnotateCrashReport(CrashReporter::Annotation::DOMIPCEnabled, - true); + if (aUseRemoteTabs && !gIPCEnabledAnnotation) { + gIPCEnabledAnnotation = true; } // Don't allow non-remote tabs with remote subframes. @@ -1693,11 +1691,8 @@ NS_IMETHODIMP BrowsingContext::SetRemoteSubframes(bool aUseRemoteSubframes) { return NS_ERROR_FAILURE; } - static bool annotated = false; - if (aUseRemoteSubframes && !annotated) { - annotated = true; - CrashReporter::AnnotateCrashReport( - CrashReporter::Annotation::DOMFissionEnabled, true); + if (aUseRemoteSubframes && !gFissionEnabledAnnotation) { + gFissionEnabledAnnotation = true; } // Don't allow non-remote tabs with remote subframes. diff --git a/docshell/base/CanonicalBrowsingContext.cpp b/docshell/base/CanonicalBrowsingContext.cpp index 33ed5aab28..84f2d2960a 100644 --- a/docshell/base/CanonicalBrowsingContext.cpp +++ b/docshell/base/CanonicalBrowsingContext.cpp @@ -1220,7 +1220,8 @@ Maybe<int32_t> CanonicalBrowsingContext::HistoryGo( // Check for user interaction if desired, except for the first and last // history entries. We compare with >= to account for the case where // aOffset >= length. - if (!aRequireUserInteraction || index.value() >= shistory->Length() - 1 || + if (!StaticPrefs::browser_navigation_requireUserInteraction() || + !aRequireUserInteraction || index.value() >= shistory->Length() - 1 || index.value() <= 0) { break; } @@ -2579,11 +2580,6 @@ nsresult CanonicalBrowsingContext::WriteSessionStorageToSessionStore( void CanonicalBrowsingContext::UpdateSessionStoreSessionStorage( const std::function<void()>& aDone) { - if (!StaticPrefs::browser_sessionstore_collect_session_storage_AtStartup()) { - aDone(); - return; - } - using DataPromise = BackgroundSessionStorageManager::DataPromise; BackgroundSessionStorageManager::GetData( this, StaticPrefs::browser_sessionstore_dom_storage_limit(), @@ -2612,7 +2608,7 @@ void CanonicalBrowsingContext::UpdateSessionStoreForStorage( } void CanonicalBrowsingContext::MaybeScheduleSessionStoreUpdate() { - if (!StaticPrefs::browser_sessionstore_platform_collection_AtStartup()) { + if (!SessionStorePlatformCollection()) { return; } diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index f2a9e0fa59..3404597343 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -5666,7 +5666,7 @@ nsDocShell::OnStateChange(nsIWebProgress* aProgress, nsIRequest* aRequest, mBusyFlags = (BusyFlags)(BUSY_FLAGS_BUSY | BUSY_FLAGS_BEFORE_PAGE_LOAD); if ((aStateFlags & STATE_RESTORING) == 0) { - if (StaticPrefs::browser_sessionstore_platform_collection_AtStartup()) { + if (SessionStorePlatformCollection()) { if (IsForceReloadType(mLoadType)) { if (WindowContext* windowContext = mBrowsingContext->GetCurrentWindowContext()) { @@ -6393,7 +6393,7 @@ nsresult nsDocShell::EndPageLoad(nsIWebProgress* aProgress, // incorrectly overrides session store data from the following load. return NS_OK; } - if (StaticPrefs::browser_sessionstore_platform_collection_AtStartup()) { + if (SessionStorePlatformCollection()) { if (WindowContext* windowContext = mBrowsingContext->GetCurrentWindowContext()) { using Change = SessionStoreChangeListener::Change; @@ -6475,6 +6475,9 @@ nsresult nsDocShell::CreateAboutBlankDocumentViewer( nsCOMPtr<nsIDocumentViewer> viewer; nsresult rv = NS_ERROR_FAILURE; + PROFILER_MARKER_UNTYPED("CreateAboutBlankDocumentViewer", DOM, + MarkerStack::Capture()); + MOZ_ASSERT_IF(aActor, aActor->DocumentPrincipal() == aPrincipal); /* mCreatingDocument should never be true at this point. However, it's @@ -10590,7 +10593,8 @@ static nsresult AppendSegmentToString(nsIInputStream* aIn, void* aClosure, } /* static */ uint32_t nsDocShell::ComputeURILoaderFlags( - BrowsingContext* aBrowsingContext, uint32_t aLoadType) { + BrowsingContext* aBrowsingContext, uint32_t aLoadType, + bool aIsDocumentLoad) { MOZ_ASSERT(aBrowsingContext); uint32_t openFlags = 0; @@ -10601,6 +10605,13 @@ static nsresult AppendSegmentToString(nsIInputStream* aIn, void* aClosure, openFlags |= nsIURILoader::DONT_RETARGET; } + // Unless the pref is set, object/embed loads always specify DONT_RETARGET. + // See bug 1868001 for details. + if (!aIsDocumentLoad && + !StaticPrefs::dom_navigation_object_embed_allow_retargeting()) { + openFlags |= nsIURILoader::DONT_RETARGET; + } + return openFlags; } @@ -11376,11 +11387,14 @@ nsresult nsDocShell::UpdateURLAndHistory(Document* aDocument, nsIURI* aNewURI, if (mozilla::SessionHistoryInParent()) { MOZ_LOG(gSHLog, LogLevel::Debug, ("nsDocShell %p UpdateActiveEntry (not replacing)", this)); + nsString title(mActiveEntry->GetTitle()); + nsCOMPtr<nsIReferrerInfo> referrerInfo = mActiveEntry->GetReferrerInfo(); + UpdateActiveEntry(false, /* aPreviousScrollPos = */ Some(scrollPos), aNewURI, /* aOriginalURI = */ nullptr, - /* aReferrerInfo = */ nullptr, + /* aReferrerInfo = */ referrerInfo, /* aTriggeringPrincipal = */ aDocument->NodePrincipal(), csp, title, scrollRestorationIsManual, aData, uriWasModified); @@ -11399,12 +11413,14 @@ nsresult nsDocShell::UpdateURLAndHistory(Document* aDocument, nsIURI* aNewURI, // mode from the current entry. newSHEntry->SetScrollRestorationIsManual(scrollRestorationIsManual); + // Set the new SHEntry's title (bug 655273). nsString title; mOSHE->GetTitle(title); - - // Set the new SHEntry's title (bug 655273). newSHEntry->SetTitle(title); + nsCOMPtr<nsIReferrerInfo> referrerInfo = mOSHE->GetReferrerInfo(); + newSHEntry->SetReferrerInfo(referrerInfo); + // Link the new SHEntry to the old SHEntry's BFCache entry, since the // two entries correspond to the same document. NS_ENSURE_SUCCESS(newSHEntry->AdoptBFCacheEntry(oldOSHE), @@ -11453,6 +11469,8 @@ nsresult nsDocShell::UpdateURLAndHistory(Document* aDocument, nsIURI* aNewURI, mOSHE = newSHEntry; } + nsCOMPtr<nsIReferrerInfo> referrerInfo = mOSHE->GetReferrerInfo(); + newSHEntry->SetURI(aNewURI); newSHEntry->SetOriginalURI(aNewURI); // We replaced the URI of the entry, clear the unstripped URI as it @@ -11463,6 +11481,7 @@ nsresult nsDocShell::UpdateURLAndHistory(Document* aDocument, nsIURI* aNewURI, // in our case. We could also set it to aNewURI, with the same result. newSHEntry->SetResultPrincipalURI(nullptr); newSHEntry->SetLoadReplace(false); + newSHEntry->SetReferrerInfo(referrerInfo); } if (!mozilla::SessionHistoryInParent()) { diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h index 9f2d9a17dc..82ac6c9ab9 100644 --- a/docshell/base/nsDocShell.h +++ b/docshell/base/nsDocShell.h @@ -489,7 +489,8 @@ class nsDocShell final : public nsDocLoader, bool HasDocumentViewer() const { return !!mDocumentViewer; } static uint32_t ComputeURILoaderFlags( - mozilla::dom::BrowsingContext* aBrowsingContext, uint32_t aLoadType); + mozilla::dom::BrowsingContext* aBrowsingContext, uint32_t aLoadType, + bool aIsDocumentLoad = true); void SetLoadingSessionHistoryInfo( const mozilla::dom::LoadingSessionHistoryInfo& aLoadingInfo, diff --git a/docshell/base/nsDocShellTreeOwner.cpp b/docshell/base/nsDocShellTreeOwner.cpp index 9f1ab23a6c..6d8eb11cc6 100644 --- a/docshell/base/nsDocShellTreeOwner.cpp +++ b/docshell/base/nsDocShellTreeOwner.cpp @@ -18,7 +18,7 @@ #include "nsAtom.h" #include "nsReadableUtils.h" #include "nsUnicharUtils.h" -#include "mozilla/LookAndFeel.h" +#include "mozilla/StaticPrefs_ui.h" // Interfaces needed to be included #include "nsPresContext.h" @@ -1177,16 +1177,15 @@ nsresult ChromeTooltipListener::MouseMove(Event* aMouseEvent) { } if (!mShowingTooltip) { - if (nsCOMPtr<EventTarget> eventTarget = aMouseEvent->GetComposedTarget()) { + if (nsCOMPtr<EventTarget> eventTarget = aMouseEvent->GetOriginalTarget()) { mPossibleTooltipNode = nsINode::FromEventTarget(eventTarget); } if (mPossibleTooltipNode) { nsresult rv = NS_NewTimerWithFuncCallback( getter_AddRefs(mTooltipTimer), sTooltipCallback, this, - LookAndFeel::GetInt(LookAndFeel::IntID::TooltipDelay, 500), - nsITimer::TYPE_ONE_SHOT, "ChromeTooltipListener::MouseMove", - GetMainThreadSerialEventTarget()); + StaticPrefs::ui_tooltip_delay_ms(), nsITimer::TYPE_ONE_SHOT, + "ChromeTooltipListener::MouseMove", GetMainThreadSerialEventTarget()); if (NS_FAILED(rv)) { mPossibleTooltipNode = nullptr; NS_WARNING("Could not create a timer for tooltip tracking"); |